C#实现RSA加密解密

简介:

RSA公钥加密算法是1977年由Ron Rivest、Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的。RSA取名来自开发他们三者的名字。RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的所有密码攻击,已被ISO推荐为公钥数据加密标准。RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。

  RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价。即RSA的重大缺陷是无法从理论上把握它的保密性能如何,而且密码学界多数人士倾向于因子分解不是NPC问题。

  RSA的缺点主要有:

A)产生密钥很麻烦,受到素数产生技术的限制,因而难以做到一次一密。

B)分组长度太大,为保证安全性,n 至少也要 600bits以上,使运算代价很高,尤其是速度较慢,较对称密码算法慢几个数量级;且随着大数分解技术的发展,这个

长度还在增加,不利于数据格式的标准化。目前,SET(Secure Electronic Transaction)协议中要求CA采用2048bits长的密钥,其他实体使用1024比特的密钥。C)RSA密钥长度随着保密级别提高,增加很快。下表列出了对同一安全级别所对应的密钥长度。

 

保密级别 对称密钥长度(bit) RSA密钥长度(bit) ECC密钥长度(bit) 保密年限
80 80 1024 160 2010
112 112 2048 224 2030
128 128 3072 256 2040
192 192 7680 384 2080
256 256 15360 512 2120

 这种算法1978年就出现了,它是第一个既能用于数据加密也能用于数字签名的算法。它易于理解和操作,也很流行。算法的名字以发明者的名字命名:Ron Rivest, AdiShamir 和Leonard Adleman。早在1973年,英国国家通信总局的数学家Clifford Cocks就发现了类似的算法。但是他的发现被列为绝密,直到1998年才公诸于世。

 

  RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。

 

  RSA的算法涉及三个参数,n、e1、e2。

 

  其中,n是两个大质数p、q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度。

 

  e1和e2是一对相关的值,e1可以任意取,但要求e1与(p-1)*(q-1)互质;再选择e2,要求(e2*e1)mod((p-1)*(q-1))=1。

 

  (n及e1),(n及e2)就是密钥对。

 

  RSA加解密的算法完全相同,设A为明文,B为密文,则:A=B^e1 mod n;B=A^e2 mod n;

 

  e1和e2可以互换使用,即:

 

  A=B^e2 mod n;B=A^e1 mod n;

 

 

C#代码实现

需引用using System.Security.Cryptography;

 

 
  1. /// <summary>  
  2.         /// RSA加密  
  3.         /// </summary>  
  4.         /// <param name="publickey"></param>  
  5.         /// <param name="content"></param>  
  6.         /// <returns></returns>  
  7.         public static string RSAEncrypt(string publickey, string content)  
  8.         {  
  9.             publickey = @"<RSAKeyValue><Modulus>5m9m14XH3oqLJ8bNGw9e4rGpXpcktv9MSkHSVFVMjHbfv+SJ5v0ubqQxa5YjLN4vc49z7SVju8s0X4gZ6AzZTn06jzWOgyPRV54Q4I0DCYadWW4Ze3e+BOtwgVU1Og3qHKn8vygoj40J6U85Z/PTJu3hN1m75Zr195ju7g9v4Hk=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>";  
  10.             RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();  
  11.             byte[] cipherbytes;  
  12.             rsa.FromXmlString(publickey);  
  13.             cipherbytes = rsa.Encrypt(Encoding.UTF8.GetBytes(content), false);  
  14.  
  15.             return Convert.ToBase64String(cipherbytes);  
  16.         }  
  17.  
  18.         /// <summary>  
  19.         /// RSA解密  
  20.         /// </summary>  
  21.         /// <param name="privatekey"></param>  
  22.         /// <param name="content"></param>  
  23.         /// <returns></returns>  
  24.         public static string RSADecrypt(string privatekey, string content)  
  25.         {  
  26.             privatekey = @"<RSAKeyValue><Modulus>5m9m14XH3oqLJ8bNGw9e4rGpXpcktv9MSkHSVFVMjHbfv+SJ5v0ubqQxa5YjLN4vc49z7SVju8s0X4gZ6AzZTn06jzWOgyPRV54Q4I0DCYadWW4Ze3e+BOtwgVU1Og3qHKn8vygoj40J6U85Z/PTJu3hN1m75Zr195ju7g9v4Hk=</Modulus><Exponent>AQAB</Exponent><P>/hf2dnK7rNfl3lbqghWcpFdu778hUpIEBixCDL5WiBtpkZdpSw90aERmHJYaW2RGvGRi6zSftLh00KHsPcNUMw==</P><Q>6Cn/jOLrPapDTEp1Fkq+uz++1Do0eeX7HYqi9rY29CqShzCeI7LEYOoSwYuAJ3xA/DuCdQENPSoJ9KFbO4Wsow==</Q><DP>ga1rHIJro8e/yhxjrKYo/nqc5ICQGhrpMNlPkD9n3CjZVPOISkWF7FzUHEzDANeJfkZhcZa21z24aG3rKo5Qnw==</DP><DQ>MNGsCB8rYlMsRZ2ek2pyQwO7h/sZT8y5ilO9wu08Dwnot/7UMiOEQfDWstY3w5XQQHnvC9WFyCfP4h4QBissyw==</DQ><InverseQ>EG02S7SADhH1EVT9DD0Z62Y0uY7gIYvxX/uq+IzKSCwB8M2G7Qv9xgZQaQlLpCaeKbux3Y59hHM+KpamGL19Kg==</InverseQ><D>vmaYHEbPAgOJvaEXQl+t8DQKFT1fudEysTy31LTyXjGu6XiltXXHUuZaa2IPyHgBz0Nd7znwsW/S44iql0Fen1kzKioEL3svANui63O3o5xdDeExVM6zOf1wUUh/oldovPweChyoAdMtUzgvCbJk1sYDJf++Nr0FeNW1RB1XG30=</D></RSAKeyValue>";  
  27.             RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();  
  28.             byte[] cipherbytes;  
  29.             rsa.FromXmlString(privatekey);  
  30.             cipherbytes = rsa.Decrypt(Convert.FromBase64String(content), false);  
  31.  
  32.             return Encoding.UTF8.GetString(cipherbytes);  
  33.         } 

 


本文转自linzheng 51CTO博客,原文链接:http://blog.51cto.com/linzheng/1078716

相关文章
|
17天前
|
存储 安全 数据库
双重防护,无懈可击!Python AES+RSA加密方案,构建最强数据安全堡垒
【8月更文挑战第3天】在数字时代,数据安全至关重要。Python AES+RSA加密方案提供了一种强大且可靠的数据保护方式。AES以高效安全著称,适用于大量数据的快速加密;RSA作为非对称加密技术,确保了密钥传输的安全性。二者结合形成“内外兼修”的加密策略:AES加密数据内容,RSA保护AES密钥,共同构建起数据安全的双重保险。通过示例代码展示了这一加密流程,强调了加密后密钥与密文的安全传输和存储的重要性。在实际应用中,应采用HTTPS等安全协议进行传输,并将数据安全存储于加密的数据库或文件系统中。
44 12
|
18天前
|
安全 数据安全/隐私保护 Python
|
17天前
|
存储 安全 数据安全/隐私保护
打造安全防线!Python AES&RSA加密工具,黑客绕道走的秘籍
【8月更文挑战第3天】数字化时代下,信息安全至关重要。本文介绍如何用Python结合AES与RSA构建加密工具。AES因其高效加密大量数据的能力而被选中;RSA作为非对称加密算法,在密钥管理和数字签名上表现出色。先安装`pycryptodome`库,接着实现AES加密解密功能,并利用RSA加密AES密钥以安全传递。这套方案不仅速度快,还能有效保障数据安全,为开发者提供坚实的信息防护屏障。
26 5
|
18天前
|
安全 算法 数据安全/隐私保护
深度揭秘!Python加密技术的背后,AES与RSA如何守护你的数据安全
【8月更文挑战第2天】随着数字化进程的加速,数据安全变得至关重要。Python作为强大的编程工具,在数据加密中扮演关键角色。AES(高级加密标准)是对称加密的经典案例,以其高效安全的特点广泛应用于数据加密;通过PyCryptodome库可轻松实现AES加密。另一方面,RSA作为一种非对称加密算法,利用公钥加密、私钥解密的方式确保数据完整性及身份验证,适用于密钥交换和数字签名等场景。在实际应用中,AES与RSA经常协同工作:RSA加密AES密钥,AES加密数据内容,形成高效且安全的混合加密方案。未来,AES与RSA将继续在数据安全领域发挥重要作用。
33 5
|
18天前
|
安全 数据安全/隐私保护 C++
RSA密钥的秘密花园:Python带你漫步加密解密的知识殿堂
【8月更文挑战第2天】RSA密钥的秘密花园以非对称加密守护信息安全。对称加密如乡间小屋, 发送方与接收方共享钥匙; 而RSA像宏伟城堡, 拥有公钥和私钥。公钥加密信息, 私钥解密, 解决了密钥安全传递难题。借助Python和pycryptodome库, 我们可体验RSA加密解密过程, 生成密钥对, 加密消息, 并成功解密, 展现其强大能力和在信息安全中的独特作用。
31 2
|
18天前
|
安全 算法 数据安全/隐私保护
黑客克星!Python加密艺术大公开,AES、RSA双剑合璧,守护你的数字世界
【8月更文挑战第1天】在数据泛滥的时代,Python以强大的加密技术保护数字安全。AES以其高效安全特性在加密领域独树一帜,能将敏感信息转化为难以破解的乱码。通过`pycryptodome`库可轻松实现AES加密。然而,AES密钥的安全分发成为难题,这时RSA非对称加密大显身手。RSA结合公钥加密与私钥解密,确保密钥传输安全。Python结合AES与RSA,编织出坚不可摧的防护网,共同守护数字世界的安宁。
16 1
|
4天前
|
Java C# 数据安全/隐私保护
如何 使 Java、C# md5 加密的值保持一致
如何 使 Java、C# md5 加密的值保持一致
6 0
|
5天前
|
C# 图形学 数据安全/隐私保护
Unity数据加密☀️ 二、使用Rider将C#代码生成DLL文件
Unity数据加密☀️ 二、使用Rider将C#代码生成DLL文件
|
1月前
|
算法 C# 数据安全/隐私保护