【发布时间】:2018-08-19 06:10:31
【问题描述】:
我正在尝试手动设置RSAParameters 的属性,但是当我尝试加密、解密甚至实例化RSACryptoServiceProvider 时遇到各种错误。
如果我只设置指数和模数,我可以加密消息;但是当我尝试解密它时,我得到一个Internal.Cryptography.CryptoThrowHelper.WindowsCryptographicException: 'Key does not exist
如果我设置所有属性,我会得到一个System.Security.Cryptography.CryptographicException: 'The specified RSA parameters are not valid; both Exponent and Modulus are required fields.'
我的问题是为什么?我的参数有什么问题?
我显然不在字段中使用随机值;我从另一个项目中复制粘贴了他们的字符串表示形式。
下面是我编写的代码,它的目标是 .Net Core 2.1。 我更新了它以包含这个length restrictions
namespace PlayingWithCryptography {
using System;
using System.Linq;
using System.Numerics;
using System.Security.Cryptography;
using System.Text;
public static class Program {
private static void Main(string[] args) {
var msg = "lol";
var encodedMessage = Encoding.ASCII.GetBytes(msg);
var parameters = new RSAParameters();
parameters.P = BigInteger.Parse("14299623962416399520070177382898895550795403345466153217470516082934737582776038882967213386204600674145392845853859217990626450972452084065728686565928113").ToByteArray();
parameters.Q = BigInteger.Parse("7630979195970404721891201847792002125535401292779123937207447574596692788513647179235335529307251350570728407373705564708871762033017096809910315212884101").ToByteArray();
parameters.D = BigInteger.Parse("46730330223584118622160180015036832148732986808519344675210555262940258739805766860224610646919605860206328024326703361630109888417839241959507572247284807035235569619173792292786907845791904955103601652822519121908367187885509270025388641700821735345222087940578381210879116823013776808975766851829020659073").ToByteArray();
parameters.Modulus = BigInteger.Parse("109120132967399429278860960508995541528237502902798129123468757937266291492576446330739696001110603907230888610072655818825358503429057592827629436413108566029093628212635953836686562675849720620786279431090218017681061521755056710823876476444260558147179707119674283982419152118103759076030616683978566631413").ToByteArray();
parameters.Exponent = BigInteger.Parse("65537").ToByteArray();
parameters.DP = BigInteger.Parse("11141736698610418925078406669215087697114858422461871124661098818361832856659225315773346115219673296375487744032858798960485665997181641221483584094519937").ToByteArray();
parameters.DQ = BigInteger.Parse("4886309137722172729208909250386672706991365415741885286554321031904881408516947737562153523770981322408725111241551398797744838697461929408240938369297973").ToByteArray();
parameters.InverseQ = BigInteger.Parse("5610960212328996596431206032772162188356793727360507633581722789998709372832546447914318965787194031968482458122348411654607397146261039733584248408719418").ToByteArray();
Console.WriteLine($"M[0]={parameters.Modulus[0]}");
Console.WriteLine($"D.Length={parameters.D.Length}");
Console.WriteLine($"M.Length={parameters.Modulus.Length}");
Console.WriteLine($"E={parameters.Exponent[0]}");
Console.WriteLine($"P.Length={ parameters.P.Length}");
Console.WriteLine($"Q.Length={ parameters.Q.Length}");
Console.WriteLine($"DP.Length={ parameters.DP.Length}");
Console.WriteLine($"DQ.Length={ parameters.DQ.Length}");
Console.WriteLine($"InverseQ.Length={ parameters.InverseQ.Length}");
// Adding zeros coz https://stackoverflow.com/questions/42098493/decrypting-with-rsa-encryption-in-vb-net/42117655#42117655
parameters.D = new byte[] { 0 }.Concat(parameters.D).ToArray();
parameters.DQ = new byte[] { 0 }.Concat(parameters.DQ).ToArray();
parameters.InverseQ = new byte[] { 0 }.Concat(parameters.InverseQ).ToArray();
Console.WriteLine();
Console.WriteLine($"M[0]={parameters.Modulus[0]}");
Console.WriteLine($"D.Length={parameters.D.Length}");
Console.WriteLine($"M.Length={parameters.Modulus.Length}");
Console.WriteLine($"E[0]={parameters.Exponent[0]}");
Console.WriteLine($"P.Length={ parameters.P.Length}");
Console.WriteLine($"Q.Length={ parameters.Q.Length}");
Console.WriteLine($"DP.Length={ parameters.DP.Length}");
Console.WriteLine($"DQ.Length={ parameters.DQ.Length}");
Console.WriteLine($"InverseQ.Length={ parameters.InverseQ.Length}");
var csp = RSACryptoServiceProvider.Create();
csp.ImportParameters(parameters);
var encrypted = csp.Encrypt(
data: encodedMessage,
padding: RSAEncryptionPadding.OaepSHA256);
var decrypted = csp.Decrypt(
data: encrypted,
padding: RSAEncryptionPadding.OaepSHA256);
var decoded = Encoding.ASCII.GetString(decrypted);
Console.WriteLine(decoded);
Console.WriteLine("Done!");
}
}
}
已回答对于处于类似情况的任何人,请阅读(并投票)James K Polk 的回答,然后是 answer for this question
【问题讨论】:
-
D参数通常称为解密指数。您需要它解密数据。这就是为什么我们说 RSA 是非对称加密的一个例子:不对称是一个密钥用于加密,另一个密钥用于解密。
标签: c# encryption .net-core rsa