rsa解密错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了rsa解密错误相关的知识,希望对你有一定的参考价值。

求大神解答rsa解密报参数错误具体报错代码Dim Plaintext As Byte() = RSACryptography.Decrypt(ToDecrypt, False)下面完整解密代码Public Function RSADecrypt(ByVal privatekey As String, ByVal ciphertext As String) As String Dim RSACryptography As RSACryptoServiceProvider = New RSACryptoServiceProvider RSACryptography.FromXmlString(RSAPrivateKeyJava2DotNet(privatekey)) Dim CiphertextData() As Byte = Convert.FromBase64String(ciphertext) Dim MaxBlockSize As Int32 = RSACryptography.KeySize / 8 If CiphertextData.Length <= MaxBlockSize Then Return Encoder.GetString(RSACryptography.Decrypt(CiphertextData, False)) Else Dim CrypStream = New MemoryStream(CiphertextData) Dim PlaiStream = New MemoryStream() Dim Buffer(MaxBlockSize) As Byte Dim BlockSize As Int32 = CrypStream.Read(Buffer, 0, MaxBlockSize) While BlockSize > 0 Dim ToDecrypt(BlockSize - 1) As Byte Array.Copy(Buffer, 0, ToDecrypt, 0, BlockSize) Dim Plaintext As Byte() = RSACryptography.Decrypt(ToDecrypt, False) PlaiStream.Write(Plaintext, 0, Plaintext.Length) BlockSize = CrypStream.Read(Buffer, 0, MaxBlockSize) End While CrypStream.Dispose() PlaiStream.Dispose() Return Encoder.GetString(PlaiStream.ToArray()) End If End Function
而且参数有值 求大神,在线等。。。

参考技术A RSA解密错误,可能是数据填充方面的问题。RSA是一种块加密的算法,所以对于明文需要将他们分成固定的块长度,考虑到输入的数据长度的问题,所以加解密的填充有好几种:1无填充,就是直接对明文进行加密2PKCS1。将数据长度分成密钥长度-11byte,比如密钥是1024bit,那么长度就是1024/8-11=117bytes,具体的格式:先填0,2,然后随机生成其他的byte,后面才是真正的数据3PKCS1_OAEP将数据长度分成密钥长度-41byte,比如密钥是1024bit,那么长度就是1024/8-41=77bytes,先填0,随机或者是固定的测试向量加20个bytes,然后加20个数字签名的数据,最后才是数据4SSLV23,将数据长度分成密钥长度-11byte,比如密钥是1024bit,那么长度就是1024/8-11=117bytes,具体的格式:先填0,2,填入8个3,填入一个'\0',最后才是真正的数据。追问

这是我的加密方法   我就加密了aaaa 解密就报错

本回答被提问者采纳

RSA OAEP、Golang 加密、Java 解密 -BadPaddingException:解密错误

【中文标题】RSA OAEP、Golang 加密、Java 解密 -BadPaddingException:解密错误【英文标题】:RSA OAEP, Golang Encrypt, Java Decrypt -BadPaddingException: Decryption error 【发布时间】:2018-09-15 14:41:13 【问题描述】:

我正在尝试解密使用 RSA-OAEP 在 Golang 中加密的字符串。但得到 BadPaddingException: 解密错误。很难弄清楚我错过了什么..

这里是Golang的加密方法

func encryptString() 
rootPEM := io_related.ReadFile("../../resources/pubkey.pem")
    //fmt.Printf("Cert String %q \n", rootPEM)

    block, _ := pem.Decode([]byte(rootPEM))
    var cert *x509.Certificate
    cert, _ = x509.ParseCertificate(block.Bytes)
    rsaPublicKey := cert.PublicKey.(*rsa.PublicKey)

    secretMessage := []byte("password")
    label := []byte("")

    // crypto/rand.Reader is a good source of entropy for randomizing the
    // encryption function.
    rng := rand.Reader

    ciphertext, err := rsa.EncryptOAEP(sha256.New(), rng, rsaPublicKey, secretMessage, label)
    if err != nil 
        fmt.Fprintf(os.Stderr, "Error from encryption: %s\n", err)
        return
    

    // Since encryption is a randomized function, ciphertext will be
    // different each time.

    base64EncodedString := base64.StdEncoding.EncodeToString(ciphertext)
    fmt.Println(base64EncodedString)

我的java解密方法为

public void decryptString(String base64String) throws NoSuchAlgorithmException, CertificateException, IOException, KeyStoreException, UnrecoverableKeyException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException
        FileInputStream is = new FileInputStream("priv.p12");
        KeyStore keystore = KeyStore.getInstance("PKCS12");
        keystore.load(is, "".toCharArray());
        System.out.println("Successfully loaded");


        String keyAlias = "1";


        PrivateKey key = (PrivateKey)keystore.getKey(keyAlias, "".toCharArray());

        System.out.println("key "+Base64.encodeBase64String(key.getEncoded()));
        Cipher rsaDecryptCipher;
        rsaDecryptCipher = Cipher.getInstance("RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING");
        rsaDecryptCipher.init(Cipher.DECRYPT_MODE, key);
        final byte[] plainText = rsaDecryptCipher.doFinal(Base64.decodeBase64(base64String));

        System.out.println("Plain   : " + new String(plainText));

    
    我确定我使用的是相同的密钥对而不是不同的私钥 确保在加密和解密“SHA256”时使用相同的哈希算法

我可能遗漏了一些东西,如果有人需要更多详细信息,请告诉我。感谢帮助!谢谢

【问题讨论】:

【参考方案1】:

OAEP 使用两种哈希算法:一种在标签上(fka 参数),一种在掩码生成函数 (MGF1) 内;这些可以不同。请参阅rfc8017 中的 7.1.1 和 B.2.1。

我不知道 Go 代码是否设置了一个(和哪个)或两者,但 Java 对 getInstance 的作用取决于您使用的提供程序,而这又至少部分取决于您正在使用的 Java。 Sun/Oracle 和 OpenJDK 实现中默认配置的 SunJCE 提供程序仅更改标签哈希,将 MGF1 保持在 SHA1; BouncyCastle 提供者同时改变了两者。我不知道 IBM 和 Android 在这里做什么。

一旦您确定(或猜测)Go 正在做什么,您可以通过添加到您的.init 调用适当的OAEPParameterSpec 和相关的MGF1ParameterSpec 来匹配它。

大部分都是骗OAEPwithMD5andMGF1Padding in node-rsa 和Breaking down RSA/ECB/OAEPWithSHA-256AndMGF1Padding (复制于https://security.stackexchange.com/questions/97548/breaking-down-rsa-ecb-oaepwithsha-256andmgf1padding)

【讨论】:

感谢您的解释。这有帮助。检查 Golang RSA 源代码后,我发现 Golang 对两者都使用 SHA-256,我不得不在 java 中将 MGF1 修改为 SHA-256 也使用以下代码.. Cipher oaepFromInit = Cipher.getInstance("RSA/ECB/OAEPPadding"); OAEPParameterSpec oaepParams = new OAEPParameterSpec("SHA-256", "MGF1", new MGF1ParameterSpec("SHA-256"), PSpecified.DEFAULT); 你能分享一下你在 Go 中的最终加密和在 Java (android) 代码中的解密吗?

以上是关于rsa解密错误的主要内容,如果未能解决你的问题,请参考以下文章

RSA 加密然后解密失败并出现“oaep 解码错误”

使用 RSA 的 Visa 测试卡解密错误

OpenSSL RSA解密随机失败C / C ++

在 C# 中使用具有正确私钥和公钥对的 RSA 解密时出现错误数据异常

解密 C# 中使用 RSA-OAEP 在 JavaScript 中加密的数据时出现 OAEP 填充错误

Nodejs 使用node-rsa 加密数据