Chinaunix

标题: 非对称加密 [打印本页]

作者: zlj0721    时间: 2008-12-26 10:53
标题: 非对称加密
大家 好,我想知道怎么能够编写简单的非对称加密的程序,生成一对公钥和私钥,用于加密和解密
作者: arust    时间: 2008-12-26 10:55
这个要求一点都不简单
作者: zlj0721    时间: 2008-12-26 10:56
简单说明一下也好啊,谢谢了
作者: yangsf5    时间: 2008-12-26 10:59
标题: 回复 #3 zlj0721 的帖子
估计简单是说不来的。。
如果你知道密码学的相关知识,那就把你已知的知识让大家了解下,然后再具体说说哪些细节不明白。
如果相关的知识都没有,那解说就麻烦了。
作者: net_robber    时间: 2008-12-26 11:10
直接调用openssl的函数


最简单
作者: sanor    时间: 2008-12-26 11:22
openssl中有相关api。
作者: zlj0721    时间: 2008-12-26 11:42
我主要是在unix下应用,openssl我也看过,有些复杂,配置和安装
作者: sanor    时间: 2008-12-26 12:02
装开发库就行了,然后看看文档里有关rsa,pem,bio这几部分的个别函数就可以生成pem格式的密钥文件了。还有加密解密数据。
作者: cugb_cat    时间: 2008-12-26 12:11
openssl 很简单
作者: cjaizss    时间: 2008-12-26 12:27
......和我在研究同一个东西,这个是比较难的,还是对称加密简单,不过我还是没放弃非对称加密而改对称加密
不过还是看你拿来干什么了,你的需求应该和我的不一样,我的需求和环境比较苛刻,要考虑该用硬件做还是软件做的问题(处理时间和硬件成本的权衡),不过我似乎看到一点硬件成本的曙光。

[ 本帖最后由 cjaizss 于 2008-12-26 12:33 编辑 ]
作者: zlj0721    时间: 2008-12-26 13:37
我只要是用来编写一个加密和解密的函数,生成dll文件,将来别的程序直接调用就可以了
作者: reiase    时间: 2008-12-26 13:43
不推荐自己写,找现成的吧

自己写要面对以下问题:
1 面对攻击,无力
2 移植性不好,比如俺这里一md5算法拿到x64上立马挂掉
3 据老板说,密码起作用靠的是安全机制,在好的机制下,弱的密码也能用。现有方案好就好在机制上,写个RSA没问题,但是没有密钥交换算法,RSA基本没用
作者: zlj0721    时间: 2008-12-26 13:47
我的主要是unix下的,不用连接外网,主要是内部网络调用,所以安全性不要求很高
作者: reiase    时间: 2008-12-26 13:58
安全性不高,还要什么非对称加密呢
作者: zlj0721    时间: 2008-12-26 14:06
标题: 回复 #14 reiase 的帖子
为以后其他的要求安全性高的交易程序做准备
作者: sanor    时间: 2008-12-26 14:17
那就rsa吧。
这是其中两个接口。


        int RSA_private_encrypt(int flen, unsigned char *from, unsigned char *to, RSA *rsa, int padding);

        int RSA_public_decrypt(int flen, unsigned char *from, unsigned char *to, RSA *rsa, int padding);


[ 本帖最后由 sanor 于 2008-12-26 14:18 编辑 ]
作者: zlj0721    时间: 2008-12-26 14:26
还有个问题,如何在unix 安装及配置openssl,谢谢
作者: zlj0721    时间: 2008-12-26 16:35
为什么下的openssl-0.9.8g.tar的包不能tar到unix下
作者: langue    时间: 2008-12-26 18:09
原帖由 zlj0721 于 2008-12-26 10:53 发表
大家 好,我想知道怎么能够编写简单的非对称加密的程序,生成一对公钥和私钥,用于加密和解密


你好,我知道怎么能够编写简单的非对称加密的程序,生成一对公钥和私钥,用于加密和解密。
使用数学方法可以生成公钥和私钥,用于加密和解密。
作者: cjaizss    时间: 2008-12-26 18:36
原帖由 langue 于 2008-12-26 18:09 发表


你好,我知道怎么能够编写简单的非对称加密的程序,生成一对公钥和私钥,用于加密和解密。
使用数学方法可以生成公钥和私钥,用于加密和解密。

非对称加密比对称加密计算量大的多的多,这个使我很想放弃非对称加密.
作者: scutan    时间: 2008-12-26 18:40
实际上,很少使用非对称加密算法来对整个内容进行加密。一般是使用对称加密来完成。
不过对称加密的密钥可以使用非对称加密算法来进行加密。
作者: cjaizss    时间: 2008-12-26 19:56
原帖由 scutan 于 2008-12-26 18:40 发表
实际上,很少使用非对称加密算法来对整个内容进行加密。一般是使用对称加密来完成。
不过对称加密的密钥可以使用非对称加密算法来进行加密。

非对称加密用在通信双方可以随时临时约定,并且小数据量的加密,因为非对称加密计算量很大,大规模数据量的加密/解密要出人命的
作者: scutan    时间: 2008-12-26 20:54
标题: 回复 #22 cjaizss 的帖子
嗯。确实是。大数据量一般不使用非对称。
作者: langue    时间: 2008-12-26 21:46
标题: 回复 #20 cjaizss 的帖子
没错,所以现实环境下往往是用非对称 cipher 协商通信密钥,完了之后的会话全靠这个通信密钥了,也不再用非对称 cipher。
作者: zlj0721    时间: 2008-12-29 09:27
是,只是用非对称加密报文的某段重要信息,其他的可以明文或是用对称加密来加密,但是我想知道谁能有个范例,供参考,谢谢。
作者: zlj0721    时间: 2008-12-29 13:45
现在对openssl 的unix下安装不了解,希望装过的高手给予指导帮助
作者: langue    时间: 2008-12-29 14:46
标题: 回复 #25 zlj0721 的帖子
囧,SSL/TLS就是典型。
Unix么,首先是Configure,然后make。你去官网翻翻资料吧。
作者: cugb_cat    时间: 2008-12-29 14:48
原帖由 scutan 于 2008-12-26 18:40 发表
实际上,很少使用非对称加密算法来对整个内容进行加密。一般是使用对称加密来完成。
不过对称加密的密钥可以使用非对称加密算法来进行加密。

ssl协议就是这样的
作者: A.com    时间: 2008-12-29 14:55
非对称算法一般是用来交换对称算法的密钥用的,不是用来对文件加密用的,因为非对称算法的加解密速度不够快。大数分解,椭圆算法等等都是很容易实现的非对称算法。
作者: DraculaW    时间: 2008-12-29 15:59
-@-
你是要加密大文件么?
你是要用RSA来加密这些玩意么
还是用AES吧
RSA128生成密钥对的那个速度 啧啧
作者: zlj0721    时间: 2008-12-29 16:19
用RSA生成可以
还想请问,谁在unix安装过openssl我.config时候提示
The library could not be configured for supporting multi-threaded
applications as the compiler options required on this system are not known.
作者: zlj0721    时间: 2008-12-30 15:21
请问谁在unix安装过openssl,执行./config报错
作者: guoruimin    时间: 2008-12-31 08:39
前几天发的一个帖子。
http://bbs.chinaunix.net/viewthread.php?tid=1337883

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <openssl/rsa.h>
  4. #include <openssl/applink.c>

  5. void print_buf_hex( unsigned char *buf, int len )
  6. {
  7.     int i;

  8.     for( i = 0; i < len; i++ )
  9.     {
  10.         printf( "%02x", buf[i] );
  11.     }
  12. }

  13. int main( int argc, char *argv[] )
  14. {
  15.     RSA           *rsa;
  16.     int            n;
  17.     unsigned char  text[128], cipher[128];
  18.     unsigned char  rsa_n[128], rsa_d[128];

  19.     // 生成密钥
  20.     rsa = RSA_generate_key( 1024, RSA_F4, NULL, NULL );
  21.     if( NULL == rsa )
  22.     {
  23.         printf( "main.RSA_generate_key\n" );
  24.         return -1;
  25.     }
  26.     n = RSA_size( rsa );
  27.     BN_bn2bin( rsa->n, rsa_n ); // 保存公钥
  28.     BN_bn2bin( rsa->d, rsa_d ); // 保存私钥
  29.     RSA_free( rsa );
  30.     printf( "RSA_size: %d\n\npublic modulus:\n", n );
  31.     print_buf_hex( rsa_n, sizeof(rsa_n) );
  32.     printf( "\n\nprivate exponent:\n" );
  33.     print_buf_hex( rsa_d, sizeof(rsa_d) );
  34.     printf( "\n\n" );

  35.     // 加密的过程
  36.     rsa = RSA_new();
  37.     if( NULL == rsa )
  38.     {
  39.         printf( "main.RSA_new for encrypt\n" );
  40.         return -1;
  41.     }
  42.     // 设置公钥
  43.     rsa->n = BN_bin2bn( rsa_n, sizeof(rsa_n), rsa->n );
  44.     rsa->e = BN_bin2bn( "\x01\x00\x01", 3, rsa->e );
  45.     // 设置明文并加密
  46.     for( n = 0; n < sizeof(text); n++ )
  47.     {
  48.         text[n] = n;
  49.     }
  50.     n = RSA_public_encrypt( sizeof(text), text, cipher, rsa, RSA_NO_PADDING );
  51.     RSA_free( rsa );
  52.     printf( "RSA_public_encrypt: %d\ncipher:\n", n );
  53.     print_buf_hex( cipher, sizeof(cipher) );
  54.     printf( "\n\n" );

  55.     // 解密的过程
  56.     rsa = RSA_new();
  57.     if( NULL == rsa )
  58.     {
  59.         printf( "main.RSA_new for decrypt\n" );
  60.         return -1;
  61.     }
  62.     // 设置公钥及私钥
  63.     rsa->n = BN_bin2bn( rsa_n, sizeof(rsa_n), rsa->n );
  64.     rsa->e = BN_bin2bn( "\x01\x00\x01", 3, rsa->e );
  65.     rsa->d = BN_bin2bn( rsa_d, sizeof(rsa_d), rsa->d );
  66.     // 解密数据
  67.     n = RSA_private_decrypt( sizeof(cipher), cipher, text, rsa,
  68.                              RSA_NO_PADDING );
  69.     RSA_free( rsa );
  70.     printf( "RSA_private_decrypt: %d\ntext:\n", n );
  71.     print_buf_hex( text, sizeof(text) );
  72.     putchar( '\n' );

  73.     return 0;
  74. }
复制代码





欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2