【问题标题】:What is "A device attached to the system is not functioning" error in RSA encryption?什么是 RSA 加密中的“连接到系统的设备无法运行”错误?
【发布时间】:2020-12-14 00:58:26
【问题描述】:

使用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;
    }

更新:

堆栈跟踪:

   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:\CJSecurity\CJSecurity\Program.cs

【问题讨论】:

  • 您能提供完整的堆栈跟踪吗?重新创建 PROVIDER_RSA_FULL 有点奇怪,因为它已经定义了,我不得不查找它,才发现常量的名称相同。我认为没有其他名为“Tracker”的容器?
  • 您使用的是智能卡硬件安全模块 (HSM) 之类的东西吗?您的系统在尝试访问 HSM 时可能会遇到错误。
  • @AxelKemper 不,我没有

标签: java c# encryption public-key-encryption encryption-asymmetric


【解决方案1】:

私钥不正确。我假设密钥生成失败并出现一些奇怪的错误。我用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 Files\OpenSSL-Win64\bin\openssl.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-----

【讨论】:

    猜你喜欢
    • 2021-08-15
    • 2015-03-14
    • 1970-01-01
    • 2011-03-06
    • 2021-03-03
    • 2012-08-18
    • 1970-01-01
    • 1970-01-01
    • 2016-07-01
    相关资源
    最近更新 更多