【发布时间】:2019-04-19 13:00:36
【问题描述】:
我正在从 RSACryptoServiceProvider 迁移到 RSACng 以获取新版本。但是,作为 CAPI 的 RSACryptoserviceProvider 使用 Little Endian 架构,而作为 CNG API 的 RSACng 使用 Big Endian 架构,问题是我如何使用之前使用 RSACryptoService 提供程序 (CAPI) 加密的 CNG Api 解密数据?
我已经尝试过 Array.reverse(cypherText) 并尝试使用 CNG Api 解密,但它抛出错误,“参数不正确”。
- 我还尝试了解密一半密码文本的方法,因为 CNG API 使用 RSAEncryptionPadding.OaepSHA512 填充,而 CAPI 使用 OAEP 填充。
我的 RSACryptoServiceProvider 类如下:-
public static void EncryptWithSystemKeyRSACryptoService(byte[]
plainBytes, bool representsUnicodeString, out string cypherText)
{
CspParameters cp = new CspParameters();
cp.KeyContainerName = regValue.ToString();
cp.Flags = CspProviderFlags.UseMachineKeyStore;
cp.KeyNumber = (int)KeyNumber.Exchange;
byte[] encBlockData=null;
using (RSACryptoServiceProvider rsaCSP = new RSACryptoServiceProvider(cp))
{
res = CryptResult.GeneralError;
int keysize = rsaCSP.KeySize;
//This encrypts data and uses FOAEP padding
encBlockData = rsaCSP.Encrypt(plainBytes, true);
}
//Should i have to reverse the Byte order?
// I am doing Array.reverse for encrypted data as it follows little endian architecture and CNG Api follows Big Endian architecture
Array.Reverse(encBlockData);
cypherText = BitConverter.ToString(encBlockData );
cypherText = cypherText.Replace("-", "");
cypherText = cypherText.ToLower();
}
这就是我使用 RSACryptoservice Provider (CAPI) 加密数据的方式 我的 RSACng 课程如下:-
//I am calling this to use RSACng API to get private keys
private static byte[] SetPrivateAndPublicKeysAndDecrypt(byte[] cyphertext)
{
cp.KeyContainerName = regValue.ToString();
cp.Flags = CspProviderFlags.UseMachineKeyStore;
cp.KeyNumber = (int)KeyNumber.Exchange;
using (RSACryptoServiceProvider rsaCSP = new
RSACryptoServiceProvider(cp))
{
res = CryptResult.GeneralError;
keysize = rsaCSP.KeySize;
q = rsaCSP.ExportCspBlob(false);
RSAp = rsaCSP.ExportParameters(true);
}
//created cngKey
cngKey = CngKey.Import(q, CngKeyBlobFormat.GenericPublicBlob);
//created RSACng instance
RSACng rsacng = new RSACng(cngKey)
{
KeySize = keysize
};
rsacng.ImportParameters(RSAp);
//Decrypt using RSACng API using OAEPSHA512 padding
var plainText= crypto.Decrypt(cyphertext, RSAEncryptionPadding.OaepSHA512);
return plainText;
}
预期结果应该是->明文成功解密
实际结果-> 异常捕获-> '参数不正确'。
【问题讨论】:
-
CAPI返回数据小端,而RSACryptoServiceProvider返回数据大端,无需反转。但是您的 Decrypt 填充算法必须与用于加密的算法相匹配(OaepSha1)
-
它确实有效..我使用了 OAEPSha1 填充并且有效。非常感谢
标签: cryptography endianness public-key-encryption rsacryptoserviceprovider cng