随笔:32 文章:1 评论:32 引用:0
IT博客 首页 发新随笔
发新文章 联系 聚合管理

2010年9月10日

RSA 算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。 RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。RSA的安全 性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价。
    RSA的安全性依赖于大数分解。公钥和私钥都是两个大素数( 大于 100个十进制位)的函数。据猜测,从一个密钥和密文推断出明文的难度等同于分解两个大素数的积。 
    密钥对的产生。选择两个大素数,p 和q 。计算: 
                        n = p * q 
    然后随机选择加密密钥e(PS:最常用的e值有3,17和65537,微软就是使用的65537,采用3个中的任何一个都不存在安全问题),要求 e 和 ( p - 1 ) * ( q - 1 ) 互质。最后,利用Euclid 算法计算解密密钥d, 满足 
                        e * d = 1 ( mod ( p - 1 ) * ( q - 1 ) ) 
    其中n和d也要互质。数e和n是公钥,d是私钥。两个素数p和q不再需要,应该丢弃,不要让任何人知道。 
    加密信息 m(二进制表示)时,首先把m分成等长数据块 m1 ,m2,..., mi ,块长s,其中 2^s <= n, s 尽可能的大。对应的密文是: 
                       ci = mi^e ( mod n ) ( a ) 
    解密时作如下计算: 
                       mi = ci^d ( mod n ) ( b )

    .NET提供常用的加密算法类,支持RSA的类是RSACryptoServiceProvider(命名空 间:System.Security.Cryptography),但只支持公钥加密,私钥解密。RSACryptoServiceProvider类包 括:Modulus、Exponent、P、Q、DP、DQ、InverseQ、D等8个属性,其中Modulus和Exponent就是公 钥,Modulus和D就是私钥,RSACryptoServiceProvider类提供导出公钥的方法,也提供导出私钥的方法,但导出的私钥包含上面 8个属性,显然要用RSACryptoServiceProvider实现私钥加密公钥是不可行的。

    从RSA的原理来看,公钥加密私钥解密和私钥加密公钥解密应该是等价的,在某些情况下,比如共享软件加密,我们需要用私钥加密注册码或注册文件,发给用户,用户用公钥解密注册码或注册文件进行合法性验证。

    本 人利用网上找的一个C#版的大整数类BigInteger(本人认为这是偶发现的效率最高的一个C#版大整数类)来实现私钥加密公钥加密(事实上也完全支 持公租加密私钥解密),但没有使用类BigInteger的大素数生成函数,而是直接使用类RSACryptoServiceProvider来生成大素 数。其中加密函数和解密函数的实现如下:

                /*
                 功能:用指定的私钥(n,d)加密指定字符串source
                
*/

                
private string EncryptString(string source, BigInteger d, BigInteger n)
                
{
                        
int len = source.Length;
                        
int len1 = 0;
                        
int blockLen = 0;
                        
if ((len % 128) == 0)
                                len1
= len / 128;
                        
else
                                len1
= len / 128 + 1;
                        
string block = "";
                        
string temp = "";
                        
for (int i = 0; i < len1; i++)
                        
{
                                
if (len >= 128)
                                        blockLen
= 128;
                                
else
                                        blockLen
= len;
                                block
= source.Substring(i * 128, blockLen);
                                
byte[] oText = System.Text.Encoding.Default.GetBytes(block);
                                BigInteger biText
= new BigInteger(oText);
                                BigInteger biEnText
= biText.modPow(d, n);
                                
string temp1 = biEnText.ToHexString();
                                temp
+= temp1;
                                len
-= blockLen;
                        }

                        
return temp;
                }


                
/*
                 功能:用指定的公钥(n,e)解密指定字符串source
                
*/

                
private string DecryptString(string source, BigInteger e, BigInteger n)
                
{
                        
int len = source.Length;
                        
int len1 = 0;
                        
int blockLen = 0;
                        
if ((len % 256) == 0)
                                len1
= len / 256;
                        
else
                                len1
= len / 256 + 1;
                        
string block = "";
                        
string temp = "";
                        
for (int i = 0; i < len1; i++)
                        
{
                                
if (len >= 256)
                                        blockLen
= 256;
                                
else
                                        blockLen
= len;
                                block
= source.Substring(i * 256, blockLen);
                                BigInteger biText
= new BigInteger(block, 16);
                                BigInteger biEnText
= biText.modPow(e, n);
                                
string temp1 = System.Text.Encoding.Default.GetString(biEnText.getBytes());
                                temp
+= temp1;
                                len
-= blockLen;
                        }

                        
return temp;
                }

     加密过程和解密过程代码如下所示:

                /*
                 加密过程,其中d、n是RSACryptoServiceProvider生成的D、Modulus
                
*/

                
private string EncryptProcess(string source, string d, string n)
                
{
                        
byte[] N = Convert.FromBase64String(n);
                        
byte[] D = Convert.FromBase64String(d);
                        BigInteger biN
= new BigInteger(N);
                        BigInteger biD
= new BigInteger(D);
                        
return EncryptString(source, biD, biN);
                }


                
/*
                 解密过程,其中e、n是RSACryptoServiceProvider生成的Exponent、Modulus
                
*/

                
private string DecryptProcess(string source, string e, string n)
                
{
                        
byte[] N = Convert.FromBase64String(n);
                        
byte[] E = Convert.FromBase64String(e);
                        BigInteger biN
= new BigInteger(N);
                        BigInteger biE
= new BigInteger(E);
                        
return DecryptString(source, biE, biN);
                }

     以上方法经本人实际使用,效果良好,希望对朋友们有帮助。

 

     PS:文中所用大整数类下载地址:http://www.hugesoft.net/ContentPage.aspx?p1=010001&p2=201(PS:原文此链接失效应使用原地址http://www.codeproject.com/KB/cs/biginteger.aspx)


     欢迎转载本文,转载请注册出处:炬源信息技术网(http://www.hugesoft.net/),谢谢!

posted @ 2010-09-10 21:12 清洼 阅读(1112) | 评论 (0)编辑 收藏

2009年6月6日

     摘要:   阅读全文
posted @ 2009-06-06 20:03 清洼 阅读(1338) | 评论 (1)编辑 收藏

2009年6月4日

    大学的时候,上工程制图,记得最清楚的就是一句“三维转成二维图”别的什么也没有记住,现在学习了二维图形库这么久,也有了不少的积累,我想抽空还是和大家分享一下,大家都能分享,大家才都能相互学习共同进步。
    提纲
    1.颜色
    2.绘制的空间
    3.知道颜色的访问器
    4.路径构建
    5.栅格器
    6.反走样
    7.样式
    8.图象
    9.字体
    10.泛型的结构设计

    这个计划可能会被修改,但大概的内容会是这个样子的。

posted @ 2009-06-04 22:48 清洼 阅读(571) | 评论 (1)编辑 收藏

2009年2月26日

     国家,集体,个人~~~~
     满足生活以后,真的就可以为了国家了~~~~

posted @ 2009-02-26 22:32 清洼 阅读(135) | 评论 (0)编辑 收藏

2009年2月7日

          好像近一个月以来从网上消失了,不过事实也确实是如此的~~
posted @ 2009-02-07 22:36 清洼 阅读(124) | 评论 (0)编辑 收藏

2009年1月15日

        2周之内坏了三台机器,这就不说了,也许是“她”们真的受不了我了,今天发个博客也半道给我出问题。。。。。以前FF出问题之后,内容起码还是有的,只要接着写就好了,今天可好,千八百字全没了。。。。奶奶的
        今天想说几点就是程序员在修练的时候需要的几个过程,计算机应用技术,程序设计语言,面向对象程序设计,算法,图形学,软件工程,UML语言,软件测试,这也当成是软件的八股吧~~~~
        当然,最重要的还是社会现实,生存问题会帮你改变一切~~~~想要飘的前提是生存无忧~~~
        今天才知道“跳槽”这个词最早是用来说妓女和嫖客的~~~~“绿帽”这个词也是源自元代与“妓女”及其亲属有关的。。。。。。
posted @ 2009-01-15 20:29 清洼 阅读(142) | 评论 (0)编辑 收藏

2009年1月6日

      先前在一个库中看到函数作为一个指针传到对象里面,对集合中所有的元素进行某种操作。
      今天就函数指针说明几点:
          不存在可以指向任何类型的通用函数指针
          非静态的成员函数地址不是一个指针
      函数指针一般被用来做回调(callback)

posted @ 2009-01-06 22:56 清洼 阅读(220) | 评论 (1)编辑 收藏

2009年1月4日

     奇怪的便是,但经过运算之后得到结果确实是大多数人。我们除了这些之外明显还需要别的,很多很多的东西。
     八小时外的程序员都在干什么,做自己喜欢的事吧~~~上网,游戏,
     但我觉得书法,绘画,天文,地理也都还不错,有时候看看食谱中医啥的,也挺好~~~可能已经远离游戏的年代了吧。

posted @ 2009-01-04 00:00 清洼 阅读(172) | 评论 (0)编辑 收藏

2008年11月18日

  今天突然想起一个比方来介绍agg里面的一组关系,rasterizer,scanline,和renderer之间的关系.
  它们就如同你在黑板面前拿着一本一册,用粉笔画黑板报.那本画册就是rasterizer,他存储图形,黑板套装(包括粉笔)就是我们的renderer,而你就是中间的scanline. AGG中就是通过scanline把rasterizer中存放的栅格信息用粉笔pixfmt_renderer转化到黑板rendering_buffer中,完成最终的绘制.具体过程大家还是要读代码~~:)!!!好运
posted @ 2008-11-18 00:04 清洼 阅读(1256) | 评论 (6)编辑 收藏

2008年10月23日

为了作出一个进度报告,将前一阶段的工作书面化一下,所以画了几个图,在这只能凭记忆,恢复一下了。
agg_graphic_core
rendering buffer (frame buffer 我们可以理解为显存)存储一块连续的内存区域,不知道自身具体存储内容的结构,只按照行的长度,向外提供行指针,有宽、高、步长属性。

span render 水平区段绘制器,用于绘制scanline中的段,与rendering buffer直接交互,将scanline的内容映射到显存中。

outline 轮廓线,将矢量数据转化为点阵格式 rasterizer 内部类。
scanline 将点阵格式的点集合,转化成为renderer使用的水平区段。

renderer 将点阵数据填上颜色放入显存中

rasterizer 栅格器 用于转化上层的矢量数据到栅格集合中。

Vector transitions 矢量变化,一个复杂的集合对应着n多convs 对点集合的操作。
posted @ 2008-10-23 21:16 清洼 阅读(719) | 评论 (0)编辑 收藏
CALENDER
<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

常用链接

留言簿(3)

随笔档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜


Powered By: 博客园
模板提供沪江博客