CTOCIO IT专家网

天极传媒 比特网 | 天极网 | IT专家网 | IT商网 | 52PK游戏网 | 手机天极 | IT分众 |
IT专家网搜索

网络安全,安全,网络安全设备,信息安全产品,网络安全新闻,信息安全市场分析,黑客攻防,防黑反黑技巧,黑客,网络安全技术,网络安全方案,病毒播报,最新病毒库,攻防技巧,入侵渗透,新闻,思科,Juniper,天融信,瑞星,金山,江民,卡巴斯基,赛门铁克, 趋势,绿盟科技,联想网御,MCAFEE,安氏,冰峰网络,网络入侵,木马,病毒,病毒分析,木马分析,样本分析,木马样本分析,病毒样本分析,杀毒软件

您现在的位置: IT专家网 > 安全子站 > 安全技巧

RSA算法从基础到实践

作者: watercloud ,  出处:Xfocus, 责任编辑: lvye, 
2006-09-19 21:41
  给别人发送的信息使用e加密,只要别人能用d解开就证明信息是由你发送的,构成了签名机制。别人给你发送信息时使用d加密,这样只有拥有e的你能够对其解密。

  <三>字符串加密

  把上面的过程集成一下我们就能实现一个对字符串加密解密的示例了。

  每次取字符串中的一个字符的ascii值作为M进行计算,其输出为加密后16进制

  的数的字符串形式,按3字节表示,如01F

  代码如下:

  #!/usr/bin/perl -w
  #RSA 计算过程学习程序编写的测试程序
  #watercloud 2003-8-12
  #
  use strict;
  use Math::BigInt;
  my %RSA_CORE = (n=>2773,e=>63,d=>847); #p=47,q=59
  my $N=new Math::BigInt($RSA_CORE{n});
  my $E=new Math::BigInt($RSA_CORE{e});
  my $D=new Math::BigInt($RSA_CORE{d});
  print "N=$N D=$D E=$E\n";
  sub RSA_ENCRYPT
  {
  my $r_mess = shift @_;
  my ($c,$i,$M,$C,$cmess);
  for($i=0;$i < length($$r_mess);$i++)
  {
  $c=ord(substr($$r_mess,$i,1));
  $M=Math::BigInt->new($c);
  $C=$M->copy(); $C->bmodpow($D,$N);
  $c=sprintf "%03X",$C;
  $cmess.=$c;
  }
  return \$cmess;
  }
  sub RSA_DECRYPT
  {
  my $r_mess = shift @_;
  my ($c,$i,$M,$C,$dmess);
  for($i=0;$i < length($$r_mess);$i+=3)
  {
  $c=substr($$r_mess,$i,3);
  $c=hex($c);
  $M=Math::BigInt->new($c);
  $C=$M->copy(); $C->bmodpow($E,$N);
  $c=chr($C);
  $dmess.=$c;
  }
  return \$dmess;
  }
  my $mess="RSA 娃哈哈哈~~~";
  $mess=$ARGV[0] if @ARGV >= 1;
  print "原始串:",$mess,"\n";
  my $r_cmess = RSA_ENCRYPT(\$mess);
  print "加密串:",$$r_cmess,"\n";
  my $r_dmess = RSA_DECRYPT($r_cmess);
  print "解密串:",$$r_dmess,"\n";
  #EOF

  测试一下:

  C:\Temp>perl rsa-test.pl

  N=2773 D=847 E=63

  原始串:RSA 娃哈哈哈~~~

  加密串:5CB6CD6BC58A7709470AA74A0AA74A0AA74A6C70A46C70A46C70A4

  解密串:RSA 娃哈哈哈~~~

  C:\Temp>perl rsa-test.pl 安全焦点(xfocus)

  N=2773 D=847 E=63

  原始串:安全焦点(xfocus)

  加密串:3393EC12F0A466E0AA9510D025D7BA0712DC3379F47D51C325D67B

  解密串:安全焦点(xfocus)

  <四>提高

  前面已经提到,rsa的安全来源于n足够大,我们测试中使用的n是非常小的,根本不能保障安全性,

  我们可以通过RSAKit、RSATool之类的工具获得足够大的N 及D E。

  通过工具,我们获得1024位的N及D E来测试一下:

  n=0x328C74784DF31119C526D18098EBEBB943B0032B599CEE13CC2BCE7B5FCD15F90B66EC3A85F5005D
  BDCDED9BDFCB3C4C265AF164AD55884D8278F791C7A6BFDAD55EDBC4F017F9CCF1538D4C2013433B383B
  47D80EC74B51276CA05B5D6346B9EE5AD2D7BE7ABFB36E37108DD60438941D2ED173CCA50E114705D7E2
  BC511951
  d=0x10001
  e=0xE760A3804ACDE1E8E3D7DC0197F9CEF6282EF552E8CEBBB7434B01CB19A9D87A3106DD28C523C2995
  4C5D86B36E943080E4919CA8CE08718C3B0930867A98F635EB9EA9200B25906D91B80A47B77324E66AFF2
  C4D70D8B1C69C50A9D8B4B7A3C9EE05FFF3A16AFC023731D80634763DA1DCABE9861A4789BD782A592D2B
  1965

  设原始信息

  M=0x11111111111122222222222233333333333

  完成这么大数字的计算依赖于大数运算库,用perl来运算非常简单:

  A) 用d对M进行加密如下:

  c=M**d%n :
  C:\Temp>perl -Mbigint -e " $x=Math::BigInt->bmodpow(0x11111111111122222222222233
  333333333, 0x10001, 0x328C74784DF31119C526D18098EBEBB943B0032B599CEE13CC2BCE7B5F
  CD15F90B66EC3A85F5005DBDCDED9BDFCB3C4C265AF164AD55884D8278F791C7A6BFDAD55EDBC4F0
  17F9CCF1538D4C2013433B383B47D80EC74B51276CA05B5D6346B9EE5AD2D7BE7ABFB36E37108DD6
  0438941D2ED173CCA50E114705D7E2BC511951);print $x->as_hex"
  0x17b287be418c69ecd7c39227ab681ac422fcc84bb35d8a632543b304de288a8d4434b73d2576bd
  45692b007f3a2f7c5f5aa1d99ef3866af26a8e876712ed1d4cc4b293e26bc0a1dc67e247715caa6b
  3028f9461a3b1533ec0cb476441465f10d8ad47452a12db0601c5e8beda686dd96d2acd59ea89b91
  f1834580c3f6d90898

  即用d对M加密后信息为:

  c=0x17b287be418c69ecd7c39227ab681ac422fcc84bb35d8a632543b304de288a8d4434b73d2576bd
  45692b007f3a2f7c5f5aa1d99ef3866af26a8e876712ed1d4cc4b293e26bc0a1dc67e247715caa6b
  3028f9461a3b1533ec0cb476441465f10d8ad47452a12db0601c5e8beda686dd96d2acd59ea89b91
  f1834580c3f6d90898

  B) 用e对c进行解密如下:

  m=c**e%n :
  C:\Temp>perl -Mbigint -e " $x=Math::BigInt->bmodpow(0x17b287be418c69ecd7c39227ab
  681ac422fcc84bb35d8a632543b304de288a8d4434b73d2576bd45692b007f3a2f7c5f5aa1d99ef3
  866af26a8e876712ed1d4cc4b293e26bc0a1dc67e247715caa6b3028f9461a3b1533ec0cb4764414
  65f10d8ad47452a12db0601c5e8beda686dd96d2acd59ea89b91f1834580c3f6d90898, 0xE760A
  3804ACDE1E8E3D7DC0197F9CEF6282EF552E8CEBBB7434B01CB19A9D87A3106DD28C523C29954C5D
  86B36E943080E4919CA8CE08718C3B0930867A98F635EB9EA9200B25906D91B80A47B77324E66AFF
  2C4D70D8B1C69C50A9D8B4B7A3C9EE05FFF3A16AFC023731D80634763DA1DCABE9861A4789BD782A
  592D2B1965, 0x328C74784DF31119C526D18098EBEBB943B0032B599CEE13CC2BCE7B5FCD15F90
  B66EC3A85F5005DBDCDED9BDFCB3C4C265AF164AD55884D8278F791C7A6BFDAD55EDBC4F017F9CCF
  1538D4C2013433B383B47D80EC74B51276CA05B5D6346B9EE5AD2D7BE7ABFB36E37108DD60438941
  D2ED173CCA50E114705D7E2BC511951);print $x->as_hex"
  0x11111111111122222222222233333333333

  (我的P4 1.6G的机器上计算了约5秒钟)

  得到用e解密后的m=0x11111111111122222222222233333333333 == M

  C) RSA通常的实现

  RSA简洁幽雅,但计算速度比较慢,通常加密中并不是直接使用RSA 来对所有的信息进行加密,

  最常见的情况是随机产生一个对称加密的密钥,然后使用对称加密算法对信息加密,之后用

  RSA对刚才的加密密钥进行加密。

  最后需要说明的是,当前小于1024位的N已经被证明是不安全的

  自己使用中不要使用小于1024位的RSA,最好使用2048位的。

共2页。 9 1 2

网友评论

笔名 
请您注意:遵守国家有关法律、法规,尊重网上道德,承担一切因您的行为而直接或间接引起的法律责任。    IT专家网友拥有管理笔名和留言的一切权利。
  • 周排行榜
  • 月排行榜

邮件订阅


    • 独家奉献:Oracle Advanced Security白皮书(上)评论
      在如今的全球商业环境下,公司必将面临很多安全和合规方面的挑战。要想避免这些安全风险必然需要设计透明的安全解决方案,Oracle Advanced Security提供了透明的基于标准的安全,能够保护网络、磁盘或者备份媒介上的数据。
    • 解析如何实现自动化的IT安全合规管理评论
      能够解决企业IT、审计和运作团队共同问题的方法一直是企业IT管理者所迫切希望的,自动化的企业合规管理将会及时的发现并掌控企业实际存在的各种问题。
    • 视频讲解:MS Windows系统安全评论
      本文将由7all为IT专家网用户讲解MS Windows操作系统。
    • 浅谈逆向工程在网络安全研究中的运用评论
      从某种程度上来说,计算机软件的逆向工程技术主要过程为分析计算机程序,在分析计算机程序的过程中,逐渐建立起高于源代码级别的更抽象层次的程序运行过程。

该文章的读者还阅读了

天极服务 | 关于我们 | 网站律师 | 加入我们 | 联系我们 | 广告业务 | 友情链接 | 我要挑错
All Rights Reserved, Copyright 2004-2008, Ctocio.com.cn
渝ICP证B2-20030003号 如有意见请与我们联系 powered by 天极内容管理平台CMS4i