正在做不对称加密,知道公钥加密,私钥解密和私钥加密,公钥解密原理上应该是对称的.并且也的确都会用到.但微软似乎没有提供私钥加密,公钥解密的东东.
于是查了一下,找到很多介绍大素数加密的.
以下代码是直接粘贴别人的,我算法方面不是太好,希望达人给看看,这样的算法安全么?即使原封不动的使用,也就是说别人知道我的算法,安全上也没问题么?我个人也在很努力的想懂这个算法.
功能:用指定的私钥(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);
}
(e,n)是私钥,(d,n)是公钥==>它们之间是一对的关系
目前来说,算法过程本身是公开的,也认为是安全的。
另外,RSACryptoServiceProvider已经实现了加密、解密过程
请参见别人的文章:
http://www.cnblogs.com/myitm/archive/2010/11/16/1878834.html
(e,n)是私钥,(d,n)是公钥==>它们之间是一对的关系
公钥、私钥都不是由人来选择的
而在对称加密中,密钥是人来选择的