非对称加密算法,允许使用public和私钥进行加密和解密
Asymetric encryption algorithm which allows to use public and private key for both encryption and decryption
我有以下有效的非对称加密实现:
private static RSAParameters privateKey;
private static RSAParameters publicKey;
private static void RSA()
{
var rsa = new RSACryptoServiceProvider();
privateKey = rsa.ExportParameters(true);
publicKey = rsa.ExportParameters(false);
byte[] originalMessage = GenerateRandomData();
byte[] encryptedMessage = Using(publicKey).Encrypt(originalMessage, false);
byte[] decryptedMessage = Using(privateKey).Decrypt(encryptedMessage, false);
Debug.Assert(originalMessage.SequenceEqual(decryptedMessage));
}
private static RSACryptoServiceProvider Using(RSAParameters parameters)
{
RSACryptoServiceProvider encryptor = new RSACryptoServiceProvider();
encryptor.ImportParameters(parameters);
return encryptor;
}
private static byte[] GenerateRandomData()
{
Random rnd = new Random();
byte[] originalData = new byte[10];
rnd.NextBytes(originalData);
return originalData;
}
我用它用接收方的public密钥[Using(publicKey).Encrypt(originalData)
]加密数据,这样接收方只能解密数据[Using(privateKey).Decrypt(encryptedData)
]。
现在我想为以下用例重用非对称加密:收件人发布数据和每个知道收件人 public 密钥的人(基本上是系统中的每个人,但系统外没有人,例如防止将可读数据泄漏到 public) 可以读取的保护。发布者使用他的私钥进行加密,他的 public 密钥将用于解密:
byte[] originalData = GenerateRandomData();
byte[] publishedData = Using(privateKey).Encrypt(originalData, false);
byte[] retrievedData = Using(publicKey).Decrypt(publishedData, false);
Debug.Assert(originalData.SequenceEqual(retrievedData));
然而这会产生一个
System.Security.Cryptography.CryptographicException
HResult=0x8009000D
Message=Keyset does not exist.
我不想在数据发布部分使用不同的 public-private-key-pair,尤其是在这种情况下,这意味着使 public 成为私钥。打字的时候已经很别扭了...
编辑:.NET 框架中是否包含非对称加密,如果一个密钥仅用于加密,它允许我在两个方向上使用两个密钥(public 和私有)另一个可以用来解密吗?
RSA 签名与使用私钥加密不同。
PKCS#1 v1.5 签名:
- 使用所选算法对内容进行哈希处理。
- 创建一个 DigestInfo 值来表示哈希。
- 应用填充使消息几乎但不完全是模数的大小(此处省略详细信息)。
- 使用私钥应用 RSA 原语
注意最后一步没有说“加密”。
.NET 中的 RSA 类 会为您执行填充等操作,因此它们公开了 Sign/Verify 和 Encrypt/Decrypt。您不能将它们用于交叉用途,也不能将这些 类 用于 RSA 原语(又名“原始 RSA”)。
我有以下有效的非对称加密实现:
private static RSAParameters privateKey;
private static RSAParameters publicKey;
private static void RSA()
{
var rsa = new RSACryptoServiceProvider();
privateKey = rsa.ExportParameters(true);
publicKey = rsa.ExportParameters(false);
byte[] originalMessage = GenerateRandomData();
byte[] encryptedMessage = Using(publicKey).Encrypt(originalMessage, false);
byte[] decryptedMessage = Using(privateKey).Decrypt(encryptedMessage, false);
Debug.Assert(originalMessage.SequenceEqual(decryptedMessage));
}
private static RSACryptoServiceProvider Using(RSAParameters parameters)
{
RSACryptoServiceProvider encryptor = new RSACryptoServiceProvider();
encryptor.ImportParameters(parameters);
return encryptor;
}
private static byte[] GenerateRandomData()
{
Random rnd = new Random();
byte[] originalData = new byte[10];
rnd.NextBytes(originalData);
return originalData;
}
我用它用接收方的public密钥[Using(publicKey).Encrypt(originalData)
]加密数据,这样接收方只能解密数据[Using(privateKey).Decrypt(encryptedData)
]。
现在我想为以下用例重用非对称加密:收件人发布数据和每个知道收件人 public 密钥的人(基本上是系统中的每个人,但系统外没有人,例如防止将可读数据泄漏到 public) 可以读取的保护。发布者使用他的私钥进行加密,他的 public 密钥将用于解密:
byte[] originalData = GenerateRandomData();
byte[] publishedData = Using(privateKey).Encrypt(originalData, false);
byte[] retrievedData = Using(publicKey).Decrypt(publishedData, false);
Debug.Assert(originalData.SequenceEqual(retrievedData));
然而这会产生一个
System.Security.Cryptography.CryptographicException
HResult=0x8009000D
Message=Keyset does not exist.
我不想在数据发布部分使用不同的 public-private-key-pair,尤其是在这种情况下,这意味着使 public 成为私钥。打字的时候已经很别扭了...
编辑:.NET 框架中是否包含非对称加密,如果一个密钥仅用于加密,它允许我在两个方向上使用两个密钥(public 和私有)另一个可以用来解密吗?
RSA 签名与使用私钥加密不同。
PKCS#1 v1.5 签名:
- 使用所选算法对内容进行哈希处理。
- 创建一个 DigestInfo 值来表示哈希。
- 应用填充使消息几乎但不完全是模数的大小(此处省略详细信息)。
- 使用私钥应用 RSA 原语
注意最后一步没有说“加密”。
.NET 中的 RSA 类 会为您执行填充等操作,因此它们公开了 Sign/Verify 和 Encrypt/Decrypt。您不能将它们用于交叉用途,也不能将这些 类 用于 RSA 原语(又名“原始 RSA”)。