RSA 加密中的"A device attached to the system is not functioning"错误是什么?



使用RSA并希望使用JAVA中的公钥进行加密,并使用c#中的公钥和私钥进行解密。

加密在java中运行良好,但在c#中解密时出现以下错误:"连接到系统上的装置不起作用";,这是什么意思?

Java加密方法:

static String publickey = "2rRVVVFJRbH/wAPDtnwZwu+nxU+AZ6uXxh/sW+AMCBogg7vndZsnRiHoLttYYPqOyOhfgaBOQogrIfrKL4lipK4m52SBzw/FfcM9DsKs/rYR83tBLiIAfgdnVjF27tZID+HJMFTiI30mALjr7+tfp+2lIACXA1RIKTk7S9pDmX8=";
static String Encrypt(String encodedString) {
try {
byte[] modulusBytes = Base64.getDecoder().decode(publickey);
byte[] exponentBytes = Base64.getDecoder().decode("AQAB");
BigInteger modulus = new BigInteger(1, modulusBytes);
BigInteger exponent = new BigInteger(1, exponentBytes);
RSAPublicKeySpec rsaPubKey = new RSAPublicKeySpec(modulus, exponent);
KeyFactory fact = KeyFactory.getInstance("RSA");
PublicKey pubKey = fact.generatePublic(rsaPubKey);
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.ENCRYPT_MODE, pubKey);
byte[] plainBytes = new String("big kitty dancing").getBytes("UTF-8");
byte[] cipherData = cipher.doFinal(plainBytes);
String encryptedString = Base64.getEncoder().encodeToString(cipherData);
return encryptedString;
} catch (InvalidKeySpecException | NoSuchAlgorithmException | NoSuchPaddingException |
InvalidKeyException | BadPaddingException | IllegalBlockSizeException | UnsupportedEncodingException err) {
}
return "Error";
}

C#解密方法:

static string Decrypt()
{
const int PROVIDER_RSA_FULL = 1;
const string CONTAINER_NAME = "Tracker";
CspParameters cspParams;
cspParams = new CspParameters(PROVIDER_RSA_FULL);
cspParams.KeyContainerName = CONTAINER_NAME;
RSACryptoServiceProvider rsa1 = new RSACryptoServiceProvider(cspParams);
//string str = rsa1.ToXmlString(true);

rsa1.FromXmlString("<RSAKeyValue><Modulus>2rRVVVFJRbH/wAPDtnwZwu+nxU+AZ6uXxh/sW+AMCBogg7vndZsnRiHoLttYYPqOyOhfgaBOQogrIfrKL4lipK4m52SBzw/FfcM9DsKs/rYR83tBLiIAfgdnVjF27tZID+HJMFTiI30mALjr7+tfp+2lIACXA1RIKTk7S9pDmX8=</Modulus><Exponent>AQAB</Exponent><P>+lXMCEwIN/7+eMpBrq87kQppxu3jJBTwztGTfXNaPUTx+A6uqRwug5oHBbSpYXKNDNCBzVm/0VxB3bo4FJx+ZQ==</P><Q>yasOGaJaE9xlF9T2xRuKeG9ZxCiyjhYaYB/mbtL+SIbtkRLi/AxaU4g2Il/UxhxhSXArKxIzV28zktispPJx1Q==</Q><DP>ueRgQIEFUV+fY979a1RgrVHIPpqEI1URhOMH3Q59oiXCcOumM5njyIHmWQxRAzXnG+7xlKXi1PrnRll0L4oOKQ==</DP><DQ>dfEMNgG1HJhwpxdtmqkYuoakwQvsIRzcIAuIAJh1DoWaupWJGk8/JEstHb1d+t7uJrzrAi2KyT/HscH2diE0YQ==</DQ><InverseQ>YoYF9PF6FiC0YngVeaC/eqt/ea8wMYNN3YO1LuzWpcy2exPRj2U0ZbWMvHXMUb4ea2qmhZGx1QlK4ULAuWKpXQ==</InverseQ><D>g1WAWI4pEK9TA7CA2Yyy/2FzzNiu0uQCuE2TZYRNiomo96KQXpxwqAzZLw+VDXfJMypwDMAVZe/SqzSJnFEtZxjdxaEo3VLcZ1mnbIL0vS7D6iFeYutF9kF231165qGd3k2tgymNMMpY7oYKjS11Y6JqWDU0WE5hjS2X35iG6mE=</D></RSAKeyValue>");
string data2Decrypt = "pt0DMKQM34rIp/aw64NBRhj8HZlp31i3Nu/9SP6o2Iwl9plu8k1TDbe04cQRkIDx/h6hsAKM0j13HdauidnEEvtm0yp9WrOMGut2XJUTUxWt5/y4bosm06tYtfw5HnlNHMMBtY22caCppwfdOJbiwp9rwEtWV9tXHU7VMenlVuw=";
byte[] encyrptedBytes = Convert.FromBase64String(data2Decrypt);
//Error occured in this line
byte[] plain = rsa1.Decrypt(encyrptedBytes, false); 
string decryptedString = System.Text.Encoding.UTF8.GetString(plain);
return decryptedString;
}

更新:

StackTrace:

at
System.Security.Cryptography.CryptographicException
.ThrowCryptographicException(Int32 hr)
at    System.Security.Cryptography.RSACryptoServiceProvider.DecryptKey(SafeKeyHandle
pKeyContext, Byte[] pbEncryptedKey, Int32 cbEncryptedKey, Boolean fOAEP, ObjectHandleOnStack ohRetDecryptedKey)
at System.Security.Cryptography.RSACryptoServiceProvider.Decrypt(Byte[] 
rgb, Boolean fOAEP)
at CJSecurity.Program.Decrypt() in C:CJSecurityCJSecurityProgram.cs

私钥不正确。我认为密钥生成失败了,出现了一些奇怪的错误。我用openssl检查了你的私钥,它说n不等于p*q。

$rsa1 = New-Object System.Security.Cryptography.RSACryptoServiceProvider
$rsa1.FromXmlString("<RSAKeyValue><Modulus>2rRVVVFJRbH/wAPDtnwZwu+nxU+AZ6uXxh/sW+AMCBogg7vndZsnRiHoLttYYPqOyOhfgaBOQogrIfrKL4lipK4m52SBzw/FfcM9DsKs/rYR83tBLiIAfgdnVjF27tZID+HJMFTiI30mALjr7+tfp+2lIACXA1RIKTk7S9pDmX8=</Modulus><Exponent>AQAB</Exponent><P>+lXMCEwIN/7+eMpBrq87kQppxu3jJBTwztGTfXNaPUTx+A6uqRwug5oHBbSpYXKNDNCBzVm/0VxB3bo4FJx+ZQ==</P><Q>yasOGaJaE9xlF9T2xRuKeG9ZxCiyjhYaYB/mbtL+SIbtkRLi/AxaU4g2Il/UxhxhSXArKxIzV28zktispPJx1Q==</Q><DP>ueRgQIEFUV+fY979a1RgrVHIPpqEI1URhOMH3Q59oiXCcOumM5njyIHmWQxRAzXnG+7xlKXi1PrnRll0L4oOKQ==</DP><DQ>dfEMNgG1HJhwpxdtmqkYuoakwQvsIRzcIAuIAJh1DoWaupWJGk8/JEstHb1d+t7uJrzrAi2KyT/HscH2diE0YQ==</DQ><InverseQ>YoYF9PF6FiC0YngVeaC/eqt/ea8wMYNN3YO1LuzWpcy2exPRj2U0ZbWMvHXMUb4ea2qmhZGx1QlK4ULAuWKpXQ==</InverseQ><D>g1WAWI4pEK9TA7CA2Yyy/2FzzNiu0uQCuE2TZYRNiomo96KQXpxwqAzZLw+VDXfJMypwDMAVZe/SqzSJnFEtZxjdxaEo3VLcZ1mnbIL0vS7D6iFeYutF9kF231165qGd3k2tgymNMMpY7oYKjS11Y6JqWDU0WE5hjS2X35iG6mE=</D></RSAKeyValue>")
[System.IO.File]::WriteAllBytes('rsa1.der',  $rsa1.ExportPkcs8PrivateKey())
& 'C:Program FilesOpenSSL-Win64binopenssl.exe' rsa -check -inform DER -in rsa1.der

以下是openssl命令的输出:

RSA key error: n does not equal p q
writing RSA key
-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQDatFVVUUlFsf/AA8O2fBnC76fFT4Bnq5fGH+xb4AwIGiCDu+d1
mydGIegu21hg+o7I6F+BoE5CiCsh+soviWKkribnZIHPD8V9wz0Owqz+thHze0Eu
IgB+B2dWMXbu1kgP4ckwVOIjfSYAuOvv61+n7aUgAJcDVEgpOTtL2kOZfwIDAQAB
AoGBAINVgFiOKRCvUwOwgNmMsv9hc8zYrtLkArhNk2WETYqJqPeikF6ccKgM2S8P
lQ13yTMqcAzAFWXv0qs0iZxRLWcY3cWhKN1S3GdZp2yC9L0uw+ohXmLrRfZBdt9d
euahnd5NrYMpjTDKWO6GCo0tdWOialg1NFhOYY0tl9+YhuphAkEA+lXMCEwIN/7+
eMpBrq87kQppxu3jJBTwztGTfXNaPUTx+A6uqRwug5oHBbSpYXKNDNCBzVm/0VxB
3bo4FJx+ZQJBAMmrDhmiWhPcZRfU9sUbinhvWcQoso4WGmAf5m7S/kiG7ZES4vwM
WlOINiJf1MYcYUlwKysSM1dvM5LYrKTycdUCQQC55GBAgQVRX59j3v1rVGCtUcg+
moQjVRGE4wfdDn2iJcJw66YzmePIgeZZDFEDNecb7vGUpeLU+udGWXQvig4pAkB1
8Qw2AbUcmHCnF22aqRi6hqTBC+whHNwgC4gAmHUOhZq6lYkaTz8kSy0dvV363u4m
vOsCLYrJP8exwfZ2ITRhAkBihgX08XoWILRieBV5oL96q395rzAxg03dg7Uu7Nal
zLZ7E9GPZTRltYy8dcxRvh5raqaFkbHVCUrhQsC5Yqld
-----END RSA PRIVATE KEY-----

最新更新