RSA非对称加密使用公钥、私钥两种密钥,规则上通过私钥可以生成公钥(相当于有了私钥基本上也能有公钥)。
公钥用来加密、验证签名;
私钥用来解密、签名数据(私钥不能用于加密)
数字证书是包含公钥以及身份信息的文件,且经过颁发机构的私钥签名认证。(本例中不涉及)
//构建包含非对称密钥对的RSA对象实体,密钥随机(每次构建的密钥都不相同)
System.Security.Cryptography.RSACryptoServiceProvider rsa = new System.Security.Cryptography.RSACryptoServiceProvider(1024);
//签名字节数据:先用指定哈希算法计算哈希值,然后对哈希值签名
byte[] signature = rsa.SignData(data, System.Security.Cryptography.CryptoConfig.MapNameToOID("SHA256"));
//验证签名:用指定哈希算法计算数据哈希值,然后用公钥解出私钥签名后的数据进行核对
bool r = rsa.VerifyData(data, System.Security.Cryptography.CryptoConfig.MapNameToOID("SHA256"), signature);
//以上可自行分步操作如下:
System.Security.Cryptography.SHA256Managed sha = new System.Security.Cryptography.SHA256Managed();
//计算哈希值
byte[] hash = sha.ComputeHash(data);
//签名哈希值
byte[] hashSignature = rsa.SignHash(hash, System.Security.Cryptography.CryptoConfig.MapNameToOID("SHA256"));
//验证哈希值签名
bool rh = rsa.VerifyHash(hash, System.Security.Cryptography.CryptoConfig.MapNameToOID("SHA256"), hashSignature);
//验证数据签名
bool r2=rsa.VerifyData(data, System.Security.Cryptography.CryptoConfig.MapNameToOID("SHA256"), hashSignature);
/*注意:以上分步操作要提供相同的哈希算法,否则无法通过验证*/
//加密数据
byte[] encryptedData = rsa.Encrypt(data, false);
//解密数据
byte[] myData=rsa.Decrypt(encryptedData,false);
//获取公钥字符串形式数据
string publicKey = rsa.ToXmlString(false);
//获取密钥对的字符串形式数据(包含公钥、私钥)
string keyPair= rsa.ToXmlString(true);
/*可通过密钥字符串数据重新初始化RSA对象,使RSA对象变成指定密钥的载体*/
//将公钥导入到RSA对象中(只能加密或验证签名)
rsa.FromXmlString(publicKey);
//将公钥、私钥都导入到RSA对象(可以进行所有操作)
rsa.FromXmlString(keyPair);