当前位置: 首页 > 知识库问答 >
问题:

RSA密钥块包装器:javax。加密。BadPaddingException:解密错误

符佐
2023-03-14

在一个做其他事情的大型应用程序中——我需要加密和解密一个文件。所以我一直在四处寻找,并实现了这两个核心功能,基本上使用RSA密钥包装一个随机的AES密钥来加密一个文件。对称键和iv被写入文件的开头。

我在下面的解密函数部分得到一个异常(“javax.crypto.BadPaddingException:Decryption error”)。在肯安迪夫线路上——doFinal。具体来说,这一行是异常点:Object[]keyIv=unpackKeyAndIV(xCipher.doFinal(keyBlock));

我已经检查并重新制作了RSA密钥对。我还检查了keyBlock的保存/加载。

我的直觉是,问题与我如何写/读密钥块有关——或者编码?

一个目标是使RSA/AES实例尽可能通用,这样就不需要BouncyCastle或额外的Java安全无限强度扩展。

任何关于我可能会出什么问题的想法。

提前感谢。[最终更新:下面的代码正在工作。错误是传递损坏的私钥]

// RSA_INSTANCE = "RSA";
// ASSYM_CRYPTO_STR = 1024;
// SYM_CRYPTO_STR = 128;
// SYM_CRYPTO = "AES";
// AES_INSTANCE = "AES/CTR/NoPadding";
//
// File in = plain input file
// File out = encrypted output file
// Key pubKey = public Key (that wraps a random AES key)
public static void encryptFile(File in, File out, Key pubKey) throws Exception {
    FileInputStream fin;
    FileOutputStream fout;
    int nread = 0; 
    byte[] inbuf = new byte[1024];
    fout = new FileOutputStream(out);
    fin = new FileInputStream(in);

    SecureRandom random = new SecureRandom();
    // symmetric wrapping
    Key sKey = createKeyForAES(Config.SYM_CRYPTO_STR, random);
    IvParameterSpec sIvSpec = createCtrIvForAES(0, random);

    // encrypt symmetric key with RSA/pub key
    Cipher xCipher = Cipher.getInstance(Config.RSA_INSTANCE);
    xCipher.init(Cipher.ENCRYPT_MODE, pubKey, random);
    byte[] keyBlock = xCipher.doFinal(packKeyAndIv(sKey, sIvSpec));

    fout.write(keyBlock);

    // encrypt data with symmetric key
    Cipher sCipher = Cipher.getInstance(Config.AES_INSTANCE);
    sCipher.init(Cipher.ENCRYPT_MODE, sKey, sIvSpec);

    // Now read our file and encrypt it.
    while((nread = fin.read(inbuf)) > 0) {
        fout.write(sCipher.update(inbuf, 0, nread)); // cannot be null, by construction
    }
    // NB doFinal() cannot return null, but can return a zero-length array, which is benign below.
    fout.write(sCipher.doFinal());

    fout.flush();
    fin.close();
    fout.close();
}


// Decrypt File
public static void decryptFile(File in, File out, Key privKey) throws Exception {
    FileInputStream fin;
    FileOutputStream fout;
    int nread = 0; 
    byte[] inbuf = new byte[1024];
    fout = new FileOutputStream(out);
    fin = new FileInputStream(in);

    byte[] keyBlock = new byte[128];
    nread = fin.read(keyBlock);

    Cipher xCipher = Cipher.getInstance(Config.RSA_INSTANCE);
    Cipher sCipher = Cipher.getInstance(Config.AES_INSTANCE);   

    // symmetric key/iv unwrapping step
    xCipher.init(Cipher.DECRYPT_MODE, privKey);
    Object[] keyIv = unpackKeyAndIV(xCipher.doFinal(keyBlock));

    // decryption step
    sCipher.init(Cipher.DECRYPT_MODE, (Key)keyIv[0], (IvParameterSpec)keyIv[1]);

    while((nread = fin.read(inbuf)) >0) {
        fout.write(sCipher.update(inbuf,0,nread));
    }
    fout.write(sCipher.doFinal());

    fout.flush();
    fin.close();
    fout.close();

}

public static byte[] packKeyAndIv(Key key, IvParameterSpec ivSpec) throws IOException {
    ByteArrayOutputStream bOut = new ByteArrayOutputStream();
    bOut.write(ivSpec.getIV());
    bOut.write(key.getEncoded());
    return bOut.toByteArray();
}

public static Object[] unpackKeyAndIV(byte[] data) {
    byte[] keyD = new byte[16];
    byte[] iv = new byte[data.length - 16];

    return new Object[] {
        new SecretKeySpec(data, 16, data.length - 16, "AES"),
        new IvParameterSpec(data, 0, 16)
    };
}

共有2个答案

薛博赡
2023-03-14

尝试在构造函数下添加以下内容-

ecurity.add提供商(新org.bouncycastle.jce.provider.BouncyCastleProvider());

平山
2023-03-14

根据编辑和评论。错误是将损坏的私钥传递到解密函数。以上代码工作正常。

 类似资料:
  • 我尝试解密从Web服务接收的加密数据。 使用AES 128进行加密。 我使用以下代码对数据进行解密: 在 密码doFinal() 我得到了以下例外: javax.crypto.badpaddingexception垫块损坏 我浏览了我的帖子,但没有找到解决办法。我被困在这里了。

  • 这是我的密码 抱歉,如果我的代码一团糟。

  • 我正在使用Safenet HSM(硬件安全模块)来存储我的加密密钥,并且我正在尝试使用JavaAPI和SunPKCS11解包使用RSA加密的密钥(AES/DES)。我想安全地执行此操作,以便无法从HSM中提取解包的AES/DES密钥(就像RSA私钥值是不可见的)。但是,在解包后,解包密钥的值在HSM之外的密钥对象中是可见的。 这是我的代码: 如何告诉代码不要泄露未包装的密钥?我必须在PKCS11配

  • 我想在我的项目上使用RSA/AES文件加密。我用rsa做了一对私钥/公钥和一个AES密钥,然后用公钥加密AES密钥。最后用私有RSA密钥对AES加密密钥进行解密。

  • 问题内容: 我正在编写一个从控制台输入的程序- 一个zip文件的名称,一个将包含从第一个zip文件生成的(解密)加密文件的zip文件的名称以及一个包含公钥的文件。解密时出现异常: 无法弄清楚为什么会出现此异常? 公钥: 私钥: 该程序的代码如下。任何帮助都很好:) PS:更新了方法。仍然给出相同的错误。 问题答案: 约瑟夫是对的。 使用默认参数创建密码时,默认密码为“ RSA / ECB / PK

  • 我将AES与salt和IV一起用于加密和解密一个唯一的ID,但它给出了javax。加密。解密时出现BadPaddingException。 每次解密数据时给出的完整错误堆栈跟踪 加密方法- 解密方法 我是JCA的新手。