使用 RSACryptoServiceProvider.Decrypt 解密
Decrypting using RSACryptoServiceProvider.Decrypt
我正在尝试解密消息作为密钥交换的一部分。我有一个用于生成证书的 2048 位 RSA 私钥。我收到一条消息作为 HTTP 请求的一部分,我需要使用我的私钥对其进行解密。但是,我在执行最后一行时收到以下错误消息:
"The data to be decrypted exceeds the maximum for this modulus of 256 bytes."
我试过减少数据的字节数组来解密和逆向它。如果我执行这两项操作中的任何一项,我都会收到 "Bad Data" 错误。
如有任何帮助,我们将不胜感激。
要解码的消息示例:
ajJDR09EQkUzT0prRHJlM2I1bzZGYjlaUWFpQTB6U2pQb0JGeDBvQ0tseEpYMGhmUkdSU0VJRnFnOEdQTDV5SlRJZmxoQUYzeFAxS3NGM1hFSnBobGl3Z3Y2UStydkY3ZkgvVmRLSit6bE5MZ3RTN0twUWZUaUZqMjlkLzBGVWVhL25qdnFXYTVrdlBrYUN2T2grZ1Rnc3FEd3U4ZVZiOUxhWVUzQWpRODk3MFY4VjM5c1VWYXRLcXdZbitQQkV4cFFSYXRJUlcyS2taSXpuRGZTVCt3dGZRcHMwU1lra3ZENSt6VHZnSGFRSmZNQXMvUlRiSERPVTZrNWo5dVR3SXNTOCtlalBWYjdMc1phOXU1c1plVTZpTlhvOUp1emxDalZpaVk3YnY0SkJCcHhqclRPaVA4NVhUYWg1TVhRYUZsMTZOVzE4dDMzYndnQmVkQmRwNEN3PT0=
C#代码:
//http request containing the HMAC key which is encrypted against the public key
hmacKey = oCtx.RequestContext.RequestMessage.ToString();
hmacKey = hmacKey.Remove(0, 8);
hmacKey = hmacKey.Remove(hmacKey.Length - 9);
//decode into binary using Base64
byte[] data = Convert.FromBase64String(hmacKey);
string publicCert = "-----BEGIN CERTIFICATE-----......-----END CERTIFICATE-----";
string privateKey = "-----BEGIN RSA PRIVATE KEY-----......-----END RSA PRIVATE KEY-----";
byte[] certBuffer = Helpers.GetBytesFromPEM(publicCert, PemStringType.Certificate);
byte[] keyBuffer = Helpers.GetBytesFromPEM(privateKey, PemStringType.RsaPrivateKey);
X509Certificate2 x509cert = new X509Certificate2(certBuffer);
RSACryptoServiceProvider prov = Crypto.DecodeRsaPrivateKey(keyBuffer);
x509cert.PrivateKey = prov;
//tried to reduce the size of the data to decrypt as well as reversing it
//Array.Resize(ref data, 32);
//Array.Reverse(data);
byte[] result = prov.Decrypt(data, false);
此示例提供了有关 GetBytesFromPEM 方法的更多信息:
http://www.codeproject.com/Articles/162194/Certificates-to-DB-and-Back
更新:
尝试解码两次,得到以下结果:
代码:
.....
byte[] data2 = Convert.FromBase64String(hmacKey);
string abc = Encoding.Default.GetString(data2);
byte[] data = Convert.FromBase64String(abc);
.....
byte[] result = prov.Decrypt(data, false);
string result2 = Encoding.Default.GetString(result);
结果:
Óh@-šÚz;CÏ7
.«™"ã®ÿRè±àyéK.
错误基本上是由于编码错误,二进制编码(base 64)问题和字符编码问题(UTF-8/UTF-16)。
通常您会期望 binary HMAC 被加密。相反,HMAC 是十六进制编码的,它又使用 ASCII 编码(与 UTF-8 兼容)进行编码。然而,.NET 默认是 UTF-16LE(.NET 错误地调用了 Unicode 编码)。
生成的密文采用 base 64 编码,这正是您所期望的如果结果需要以文本形式传输。相反,双基 64 似乎已被使用。由于 base 64 解码导致另一个 base 64 编码字符串,结果对于 RSA 解密来说太大而无法处理。
我正在尝试解密消息作为密钥交换的一部分。我有一个用于生成证书的 2048 位 RSA 私钥。我收到一条消息作为 HTTP 请求的一部分,我需要使用我的私钥对其进行解密。但是,我在执行最后一行时收到以下错误消息:
"The data to be decrypted exceeds the maximum for this modulus of 256 bytes."
我试过减少数据的字节数组来解密和逆向它。如果我执行这两项操作中的任何一项,我都会收到 "Bad Data" 错误。
如有任何帮助,我们将不胜感激。
要解码的消息示例:
ajJDR09EQkUzT0prRHJlM2I1bzZGYjlaUWFpQTB6U2pQb0JGeDBvQ0tseEpYMGhmUkdSU0VJRnFnOEdQTDV5SlRJZmxoQUYzeFAxS3NGM1hFSnBobGl3Z3Y2UStydkY3ZkgvVmRLSit6bE5MZ3RTN0twUWZUaUZqMjlkLzBGVWVhL25qdnFXYTVrdlBrYUN2T2grZ1Rnc3FEd3U4ZVZiOUxhWVUzQWpRODk3MFY4VjM5c1VWYXRLcXdZbitQQkV4cFFSYXRJUlcyS2taSXpuRGZTVCt3dGZRcHMwU1lra3ZENSt6VHZnSGFRSmZNQXMvUlRiSERPVTZrNWo5dVR3SXNTOCtlalBWYjdMc1phOXU1c1plVTZpTlhvOUp1emxDalZpaVk3YnY0SkJCcHhqclRPaVA4NVhUYWg1TVhRYUZsMTZOVzE4dDMzYndnQmVkQmRwNEN3PT0=
C#代码:
//http request containing the HMAC key which is encrypted against the public key
hmacKey = oCtx.RequestContext.RequestMessage.ToString();
hmacKey = hmacKey.Remove(0, 8);
hmacKey = hmacKey.Remove(hmacKey.Length - 9);
//decode into binary using Base64
byte[] data = Convert.FromBase64String(hmacKey);
string publicCert = "-----BEGIN CERTIFICATE-----......-----END CERTIFICATE-----";
string privateKey = "-----BEGIN RSA PRIVATE KEY-----......-----END RSA PRIVATE KEY-----";
byte[] certBuffer = Helpers.GetBytesFromPEM(publicCert, PemStringType.Certificate);
byte[] keyBuffer = Helpers.GetBytesFromPEM(privateKey, PemStringType.RsaPrivateKey);
X509Certificate2 x509cert = new X509Certificate2(certBuffer);
RSACryptoServiceProvider prov = Crypto.DecodeRsaPrivateKey(keyBuffer);
x509cert.PrivateKey = prov;
//tried to reduce the size of the data to decrypt as well as reversing it
//Array.Resize(ref data, 32);
//Array.Reverse(data);
byte[] result = prov.Decrypt(data, false);
此示例提供了有关 GetBytesFromPEM 方法的更多信息: http://www.codeproject.com/Articles/162194/Certificates-to-DB-and-Back
更新:
尝试解码两次,得到以下结果:
代码:
.....
byte[] data2 = Convert.FromBase64String(hmacKey);
string abc = Encoding.Default.GetString(data2);
byte[] data = Convert.FromBase64String(abc);
.....
byte[] result = prov.Decrypt(data, false);
string result2 = Encoding.Default.GetString(result);
结果:
Óh@-šÚz;CÏ7 .«™"ã®ÿRè±àyéK.
错误基本上是由于编码错误,二进制编码(base 64)问题和字符编码问题(UTF-8/UTF-16)。
通常您会期望 binary HMAC 被加密。相反,HMAC 是十六进制编码的,它又使用 ASCII 编码(与 UTF-8 兼容)进行编码。然而,.NET 默认是 UTF-16LE(.NET 错误地调用了 Unicode 编码)。
生成的密文采用 base 64 编码,这正是您所期望的如果结果需要以文本形式传输。相反,双基 64 似乎已被使用。由于 base 64 解码导致另一个 base 64 编码字符串,结果对于 RSA 解密来说太大而无法处理。