openssl rsa 私钥加密,公钥解密测试
2015-11-24 00:00
232 查看
摘要: 1)生成RSA密钥文件
2)从RSA密钥文件中进行加载密钥
参考:http://co63oc.blog.51cto.com/904636/625459
公钥加密,私钥解密时,因为加入随机数,每次得到的加密信息不固定。
私钥加密,公钥解密时,得到的加密信息固定。
======》生成RSA密钥文件
===>从RSA密钥文件中进行加载
2)从RSA密钥文件中进行加载密钥
参考:http://co63oc.blog.51cto.com/904636/625459
公钥加密,私钥解密时,因为加入随机数,每次得到的加密信息不固定。
私钥加密,公钥解密时,得到的加密信息固定。
======》生成RSA密钥文件
/* * rsa_test2.c * * Created on: 2015年11月24日 * Author: mengfh */ #include <stdio.h> #include <string.h> #include <openssl/crypto.h> #include <openssl/err.h> #include <openssl/rand.h> #include <openssl/bn.h> #include <openssl/rsa.h> #include <openssl/pem.h> #define SetKey \ key->n = BN_bin2bn(n, sizeof(n)-1, key->n); \ key->e = BN_bin2bn(e, sizeof(e)-1, key->e); \ key->d = BN_bin2bn(d, sizeof(d)-1, key->d); \ key->p = BN_bin2bn(p, sizeof(p)-1, key->p); \ key->q = BN_bin2bn(q, sizeof(q)-1, key->q); \ key->dmp1 = BN_bin2bn(dmp1, sizeof(dmp1)-1, key->dmp1); \ key->dmq1 = BN_bin2bn(dmq1, sizeof(dmq1)-1, key->dmq1); \ key->iqmp = BN_bin2bn(iqmp, sizeof(iqmp)-1, key->iqmp); \ return 0; static int key5(RSA *key) { //密钥中变量 static unsigned char n[] = "\x9c\xb5\xd4\x87\x70\xb6\x43\x03\x49\x5e\xe8\x40\xbc\xbf\x15\x79\x9e\xb2\x18\x0d\xfa\xde\xf7\xb2\x37\xd0\x22\xdb\xd4\xef\x2d\x79\x63\xdb\x38\x2b\xed\x05\xe5\x14\x0b\x9a\x80\x5c\x75\x11\xef\x1b\x89\x5b\x40\xb7\x1c\x22\x7d\x84\x59\xbc\xcc\xb5\xca\x63\xbd\x7b\xdf\x1e\x3a\x72\x13\x86\x93\xa9\x9c\xc7\xcb\x48\x3d\x8b\x8c\xa9\x4c\xce\xd7\xca\xc0\xb0\x62\x7a\x95\x7a\xd7\xbd\x27\x82\x91\x40\x90\x35\xb1\xe4\xab\x5f\xbb\x06\x29\x01\xf4\x91\xe5\x15\x5f\xd3\xc2\x13\x38\xaf\x1f\x75\x88\x47\xd1\x04\xd2\xb3\x71\xa0\x9e\xc7"; static unsigned char e[] = "\x00\x01\x00\x01"; static unsigned char d[] = "\x09\x33\x83\xef\x0f\xe7\x23\xb8\x25\xae\xb4\xe4\x58\x30\xc0\x0a\x0c\x0f\x58\xea\x39\x38\xae\x42\x80\x94\x6f\xf7\x88\x61\x22\xc2\x65\xe2\x91\x41\xc3\x00\xfd\x9a\x57\xb4\x12\xa5\x5b\x1a\x5a\x77\xbb\x70\xe8\x33\xd8\x2b\x0e\x43\x9f\x21\x3e\xc3\xcd\xc6\x5d\x71\xb8\xec\x6e\xea\x5f\x17\xa5\xe1\x43\xeb\xdd\x71\xa4\x6f\xed\x09\xf0\x8b\xbe\xd9\x26\xb5\x70\x9b\xab\x42\x70\x70\x71\xd4\x14\x8f\xa8\x2c\xc4\x23\x21\x70\x1f\xd7\xef\xfd\x6b\x02\x40\x8b\xf4\x77\x5c\x78\x08\x80\x8b\x7d\x7e\x7a\xb2\x14\xe0\xf6\x94\xf2\x56\x81"; static unsigned char p[] = "\xd6\x8c\xf3\x60\x76\x5b\x6e\x55\xde\x5a\xf7\x43\x95\x6b\x5e\xc0\xd9\x5a\xcd\xd8\x03\xd3\x65\xcb\x1d\xf6\xfe\x57\x39\x6c\xfd\x72\x06\x8b\xe8\x2e\x05\xfd\xe4\x7c\x39\x94\xa2\xea\xb8\x4c\xf5\xd6\xdc\xd7\x9a\xb8\xef\x05\xd9\xef\x96\xfa\x91\xa3\xb6\x9a\xd4\x19"; static unsigned char q[] = "\xba\xfc\x43\xf4\x79\x60\x09\x97\x37\x6e\x55\x83\xbb\xb6\xb3\x5f\x4c\x39\x00\x93\x19\x90\x64\x65\x3a\xf7\xa0\xca\x5e\x9d\x66\xd9\xee\x7d\xdb\xd0\xe2\xe7\x57\x55\x41\x90\xc7\x4b\xed\x91\x42\xea\x34\x93\x1a\x76\xb8\xd0\xf2\x74\xed\xf5\xd3\xb9\xa6\x34\x65\xdf"; static unsigned char dmp1[] = "\x4f\xfd\x89\x17\xa3\xc8\xfe\xe0\x00\xe0\xc5\x63\x6b\x27\xf6\xd1\xcb\xb7\xb1\x1b\x22\x82\x04\x67\xb0\x2a\x50\x35\x50\xf1\xb3\xa4\x79\x90\x5b\xe6\x1c\xd1\xc6\x08\x12\xa7\xb9\xfd\xec\xec\xb4\x93\x81\x0e\xd9\x5e\xad\xae\xee\xcc\x06\xec\x30\xb4\x6a\xf6\x5a\xb1"; static unsigned char dmq1[] = "\x60\x9b\x5d\x70\xbe\x15\x04\x5f\x80\x60\x1d\x06\x86\xc1\x8a\x43\x3e\x5a\x65\x15\x9b\x2b\xa2\xf3\x3a\x58\x1e\x56\xf0\x33\x5a\xa4\x56\x37\xe8\x8e\x2f\xed\x5e\x8d\xc9\xe6\x47\x51\xcf\x58\x31\xbe\x57\x93\x79\x24\xc5\xb0\x0e\xd4\xa2\xed\x53\x8a\xa3\x78\x86\xf9"; static unsigned char iqmp[] = "\x28\xc6\xca\x44\x40\x7a\xad\x4c\x74\x4d\xeb\x2d\xaa\xd7\xc8\x43\xef\x4a\x12\x44\x0a\x89\xb8\x12\x11\x7f\x40\x91\x9a\xe1\x4a\xfe\xe2\xe5\x3e\x6c\x7f\x07\x49\x04\xc9\x95\x8a\x4e\xa5\x7f\x3c\x8f\xea\xbd\x71\x2e\xca\x7a\x37\xdf\x99\x05\x2f\x0c\x03\x11\x6d\x5d"; SetKey; } int main(int argc, char *argv[]) { int err = 0; int v; RSA *key; unsigned char ptext[256]; unsigned char ctext[256]; static unsigned char ptext_ex[] = "12345678"; unsigned char ctext_ex[256]; int plen; int clen = 0; int num; int n; int i; EVP_PKEY *pkey; printf("ptext_ex: %s\n", ptext_ex); { key = RSA_new(); key5(key); plen = sizeof(ptext_ex) - 1; num = RSA_private_encrypt(plen, ptext_ex, ctext, key, RSA_PKCS1_PADDING); if (num != 128) //模数长度 { printf("PKCS#1 v1.5 encryption failed!\n"); err=1; goto next; } //加密后的数据 printf("encrypted text: \n"); for (i = 0; i < num; i++) { printf("\\x%02x", ctext[i]); } printf("\n"); printf("RSA_private_encrypt num: %d\n", num); num = RSA_public_decrypt(num, ctext, ptext, key, RSA_PKCS1_PADDING); if (num != plen || memcmp(ptext, ptext_ex, num) != 0) { printf("PKCS#1 v1.5 decryption failed!\n"); err=1; } else printf("PKCS #1 v1.5 encryption/decryption ok\n"); printf("RSA_public_decrypt num: %d\n", num); ptext[num] = '\0'; //字符串结尾 printf("ptext: %s\n", ptext); next: //公钥和私钥输出为 PEM 格式: PEM_write_RSAPrivateKey(stdout, key, NULL, NULL, 0, NULL, NULL); PEM_write_RSAPublicKey(stdout, key); //释放申请的内存 RSA_free(key); } if (err) printf("ERROR: %d\n", err); return err; }
./a.out ptext_ex: 12345678 encrypted text: \x75\x3a\x8f\x2b\x27\x2a\x84\x9e\x71\x80\x9b\x4e\xc6\xcc\x5b\x85\x63\x1f\x51\x13\x9f\x8c\xd9\x67\x8b\xde\x83\x32\x36\x65\x5e\x7f\xfa\x12\x15\xbb\x6a\xef\xf0\x07\x6d\x3b\x57\x02\x9d\x7f\x22\x98\x02\xb5\x2e\x55\xcc\xb3\x1e\x0f\xae\x81\xed\x57\x3e\x1a\xca\xe7\x18\x24\x71\x37\xe0\x4e\xa6\xf2\xc1\x52\x28\x9c\xf3\xc7\xd9\x87\x70\x05\x47\x92\x5b\xe2\xa4\xfe\xb0\x0c\x99\x44\x63\xd0\xf1\x5c\x8a\x2c\x69\x0f\x09\x02\x9d\xc1\xb6\x0d\xb8\xb9\x64\xa5\xcf\xb6\xa3\xb2\x49\xce\x23\x6d\x1c\x45\xf5\xf9\x8b\xc6\x9d\x2b\xbf\xd6 RSA_private_encrypt num: 128 PKCS #1 v1.5 encryption/decryption ok RSA_public_decrypt num: 8 ptext: 12345678 -----BEGIN RSA PRIVATE KEY----- MIICWwIBAAKBgQCctdSHcLZDA0le6EC8vxV5nrIYDfre97I30CLb1O8teWPbOCvt BeUUC5qAXHUR7xuJW0C3HCJ9hFm8zLXKY7173x46chOGk6mcx8tIPYuMqUzO18rA sGJ6lXrXvSeCkUCQNbHkq1+7BikB9JHlFV/TwhM4rx91iEfRBNKzcaCexwIDAQAB AoGACTOD7w/nI7glrrTkWDDACgwPWOo5OK5CgJRv94hhIsJl4pFBwwD9mle0EqVb Glp3u3DoM9grDkOfIT7DzcZdcbjsbupfF6XhQ+vdcaRv7Qnwi77ZJrVwm6tCcHBx 1BSPqCzEIyFwH9fv/WsCQIv0d1x4CICLfX56shTg9pTyVoECQQDWjPNgdltuVd5a 90OVa17A2VrN2APTZcsd9v5XOWz9cgaL6C4F/eR8OZSi6rhM9dbc15q47wXZ75b6 kaO2mtQZAkEAuvxD9HlgCZc3blWDu7azX0w5AJMZkGRlOvegyl6dZtnufdvQ4udX VUGQx0vtkULqNJMadrjQ8nTt9dO5pjRl3wJAT/2JF6PI/uAA4MVjayf20cu3sRsi ggRnsCpQNVDxs6R5kFvmHNHGCBKnuf3s7LSTgQ7ZXq2u7swG7DC0avZasQJAYJtd cL4VBF+AYB0GhsGKQz5aZRWbK6LzOlgeVvAzWqRWN+iOL+1ejcnmR1HPWDG+V5N5 JMWwDtSi7VOKo3iG+QJAKMbKREB6rUx0TestqtfIQ+9KEkQKibgSEX9AkZrhSv7i 5T5sfwdJBMmVik6lfzyP6r1xLsp6N9+ZBS8MAxFtXQ== -----END RSA PRIVATE KEY----- -----BEGIN RSA PUBLIC KEY----- MIGJAoGBAJy11IdwtkMDSV7oQLy/FXmeshgN+t73sjfQItvU7y15Y9s4K+0F5RQL moBcdRHvG4lbQLccIn2EWbzMtcpjvXvfHjpyE4aTqZzHy0g9i4ypTM7XysCwYnqV ete9J4KRQJA1seSrX7sGKQH0keUVX9PCEzivH3WIR9EE0rNxoJ7HAgMBAAE= -----END RSA PUBLIC KEY-----
===>从RSA密钥文件中进行加载
/* * rsa_test3.c * * Created on: 2015年11月24日 * Author: mengfh * * 功能:从文件中读取公钥、私钥数据之后再RSA相对应的操作 */ #include <stdio.h> #include <string.h> #include <openssl/crypto.h> #include <openssl/err.h> #include <openssl/rand.h> #include <openssl/bn.h> #include <openssl/rsa.h> #include <openssl/pem.h> #define SetKey \ key->n = BN_bin2bn(n, sizeof(n)-1, key->n); \ key->e = BN_bin2bn(e, sizeof(e)-1, key->e); \ key->d = BN_bin2bn(d, sizeof(d)-1, key->d); \ key->p = BN_bin2bn(p, sizeof(p)-1, key->p); \ key->q = BN_bin2bn(q, sizeof(q)-1, key->q); \ key->dmp1 = BN_bin2bn(dmp1, sizeof(dmp1)-1, key->dmp1); \ key->dmq1 = BN_bin2bn(dmq1, sizeof(dmq1)-1, key->dmq1); \ key->iqmp = BN_bin2bn(iqmp, sizeof(iqmp)-1, key->iqmp); \ return 0; static int key5(RSA *key) { //密钥中变量 static unsigned char n[] = "\x9c\xb5\xd4\x87\x70\xb6\x43\x03\x49\x5e\xe8\x40\xbc\xbf\x15\x79\x9e\xb2\x18\x0d\xfa\xde\xf7\xb2\x37\xd0\x22\xdb\xd4\xef\x2d\x79\x63\xdb\x38\x2b\xed\x05\xe5\x14\x0b\x9a\x80\x5c\x75\x11\xef\x1b\x89\x5b\x40\xb7\x1c\x22\x7d\x84\x59\xbc\xcc\xb5\xca\x63\xbd\x7b\xdf\x1e\x3a\x72\x13\x86\x93\xa9\x9c\xc7\xcb\x48\x3d\x8b\x8c\xa9\x4c\xce\xd7\xca\xc0\xb0\x62\x7a\x95\x7a\xd7\xbd\x27\x82\x91\x40\x90\x35\xb1\xe4\xab\x5f\xbb\x06\x29\x01\xf4\x91\xe5\x15\x5f\xd3\xc2\x13\x38\xaf\x1f\x75\x88\x47\xd1\x04\xd2\xb3\x71\xa0\x9e\xc7"; static unsigned char e[] = "\x00\x01\x00\x01"; static unsigned char d[] = "\x09\x33\x83\xef\x0f\xe7\x23\xb8\x25\xae\xb4\xe4\x58\x30\xc0\x0a\x0c\x0f\x58\xea\x39\x38\xae\x42\x80\x94\x6f\xf7\x88\x61\x22\xc2\x65\xe2\x91\x41\xc3\x00\xfd\x9a\x57\xb4\x12\xa5\x5b\x1a\x5a\x77\xbb\x70\xe8\x33\xd8\x2b\x0e\x43\x9f\x21\x3e\xc3\xcd\xc6\x5d\x71\xb8\xec\x6e\xea\x5f\x17\xa5\xe1\x43\xeb\xdd\x71\xa4\x6f\xed\x09\xf0\x8b\xbe\xd9\x26\xb5\x70\x9b\xab\x42\x70\x70\x71\xd4\x14\x8f\xa8\x2c\xc4\x23\x21\x70\x1f\xd7\xef\xfd\x6b\x02\x40\x8b\xf4\x77\x5c\x78\x08\x80\x8b\x7d\x7e\x7a\xb2\x14\xe0\xf6\x94\xf2\x56\x81"; static unsigned char p[] = "\xd6\x8c\xf3\x60\x76\x5b\x6e\x55\xde\x5a\xf7\x43\x95\x6b\x5e\xc0\xd9\x5a\xcd\xd8\x03\xd3\x65\xcb\x1d\xf6\xfe\x57\x39\x6c\xfd\x72\x06\x8b\xe8\x2e\x05\xfd\xe4\x7c\x39\x94\xa2\xea\xb8\x4c\xf5\xd6\xdc\xd7\x9a\xb8\xef\x05\xd9\xef\x96\xfa\x91\xa3\xb6\x9a\xd4\x19"; static unsigned char q[] = "\xba\xfc\x43\xf4\x79\x60\x09\x97\x37\x6e\x55\x83\xbb\xb6\xb3\x5f\x4c\x39\x00\x93\x19\x90\x64\x65\x3a\xf7\xa0\xca\x5e\x9d\x66\xd9\xee\x7d\xdb\xd0\xe2\xe7\x57\x55\x41\x90\xc7\x4b\xed\x91\x42\xea\x34\x93\x1a\x76\xb8\xd0\xf2\x74\xed\xf5\xd3\xb9\xa6\x34\x65\xdf"; static unsigned char dmp1[] = "\x4f\xfd\x89\x17\xa3\xc8\xfe\xe0\x00\xe0\xc5\x63\x6b\x27\xf6\xd1\xcb\xb7\xb1\x1b\x22\x82\x04\x67\xb0\x2a\x50\x35\x50\xf1\xb3\xa4\x79\x90\x5b\xe6\x1c\xd1\xc6\x08\x12\xa7\xb9\xfd\xec\xec\xb4\x93\x81\x0e\xd9\x5e\xad\xae\xee\xcc\x06\xec\x30\xb4\x6a\xf6\x5a\xb1"; static unsigned char dmq1[] = "\x60\x9b\x5d\x70\xbe\x15\x04\x5f\x80\x60\x1d\x06\x86\xc1\x8a\x43\x3e\x5a\x65\x15\x9b\x2b\xa2\xf3\x3a\x58\x1e\x56\xf0\x33\x5a\xa4\x56\x37\xe8\x8e\x2f\xed\x5e\x8d\xc9\xe6\x47\x51\xcf\x58\x31\xbe\x57\x93\x79\x24\xc5\xb0\x0e\xd4\xa2\xed\x53\x8a\xa3\x78\x86\xf9"; static unsigned char iqmp[] = "\x28\xc6\xca\x44\x40\x7a\xad\x4c\x74\x4d\xeb\x2d\xaa\xd7\xc8\x43\xef\x4a\x12\x44\x0a\x89\xb8\x12\x11\x7f\x40\x91\x9a\xe1\x4a\xfe\xe2\xe5\x3e\x6c\x7f\x07\x49\x04\xc9\x95\x8a\x4e\xa5\x7f\x3c\x8f\xea\xbd\x71\x2e\xca\x7a\x37\xdf\x99\x05\x2f\x0c\x03\x11\x6d\x5d"; SetKey; } int main(int argc, char *argv[]) { int err = 0; int v; RSA *key; unsigned char ptext[256]; unsigned char ctext[256]; static unsigned char ptext_ex[] = "12345678"; unsigned char ctext_ex[256]; int plen; int clen = 0; int num; int n; int i; FILE *fprivate, *fpbulic; EVP_PKEY *pkey; printf("ptext_ex: %s\n", ptext_ex); { key = RSA_new(); // key5(key); fprivate = fopen("./private.pem","r"); fpbulic = fopen("./public.pem", "r"); PEM_read_RSAPrivateKey(fprivate,&key,NULL,NULL); PEM_read_RSAPublicKey(fpbulic, &key, NULL, NULL); plen = sizeof(ptext_ex) - 1; num = RSA_private_encrypt(plen, ptext_ex, ctext, key, RSA_PKCS1_PADDING); if (num != 128) //模数长度 { printf("PKCS#1 v1.5 encryption failed!\n"); err=1; goto next; } //加密后的数据 printf("encrypted text: \n"); for (i = 0; i < num; i++) { printf("\\x%02x", ctext[i]); } printf("\n"); printf("RSA_private_encrypt num: %d\n", num); num = RSA_public_decrypt(num, ctext, ptext, key, RSA_PKCS1_PADDING); if (num != plen || memcmp(ptext, ptext_ex, num) != 0) { printf("PKCS#1 v1.5 decryption failed!\n"); err=1; } else printf("PKCS #1 v1.5 encryption/decryption ok\n"); printf("RSA_public_decrypt num: %d\n", num); ptext[num] = '\0'; //字符串结尾 printf("ptext: %s\n", ptext); next: //公钥和私钥输出为 PEM 格式: PEM_write_RSAPrivateKey(stdout, key, NULL, NULL, 0, NULL, NULL); PEM_write_RSAPublicKey(stdout, key); //释放申请的内存 RSA_free(key); } if (err) printf("ERROR: %d\n", err); return err; }
相关文章推荐
- apache反向代理实现内网多台主机,多域名
- SSH操作linux命令
- linux 常用命令
- IDEA 远程调试tomcat中的jsp
- 实现ecshop一键发货功能的方法
- linux环境变量
- Linux 网桥设置固定MAC
- 在LINUX下面建立GPRS无线MODEM拨号
- log4j xml配置详解
- Openstack(icehouse)计算节点链路
- TQ210 NFS服务器的配置和使用
- 天下数据浅谈服务器稳定性对于网站有哪些突出影响
- Ambari在离线环境中安装Hadoop集群
- Tomcat7.0配置JNDI数据源
- apache虚拟主机的配置,一个IP绑定多个域名
- windows查看进程命令,并查看某个进程号的heap大小
- Linux里find和grep命令
- Linux使用ssh-keygen实现SSH无密码登录
- ERP维护收费,不收费谁维护?
- 利用shell实现批量添加用户