java - 无法解密 Forge 加密的数据

标签 java node.js openssl rsa pkcs#1

我用它来创建私钥并加密:

var forge = require('node-forge');
var fs = require('fs');

var bytes = forge.random.getBytesSync(16);
console.log("random plaintext", forge.util.bytesToHex(bytes));
var keypair = forge.pki.rsa.generateKeyPair({bits: 2048, e: 17});
var encrypted = keypair.publicKey.encrypt(bytes, 'RSA-OAEP', {
  md: forge.md.sha256.create(),
  mgf1: {
    md: forge.md.sha1.create()
  }
});

console.log("ciphertext", forge.util.bytesToHex(encrypted));
fs.writeFileSync('ciphertext', encrypted);

var pem = forge.pki.privateKeyToPem(keypair.privateKey);
fs.writeFileSync('prikey.pem', pem);
console.log("private key", forge.util.bytesToHex(pem));

然后我尝试使用以下任一方法解密:

public class CryptoTest {
    public static void main(String[] args) throws Exception {
        PEMParser parser = new PEMParser(new FileReader("/tmp/prikey.pem"));
        Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
        JcaPEMKeyConverter   converter = new JcaPEMKeyConverter().setProvider("BC");
        KeyPair kp = converter.getKeyPair((PEMKeyPair) parser.readObject());
        RSAPublicKey pubkey = (RSAPublicKey) kp.getPublic();
        RSAPrivateKey privkey = (RSAPrivateKey) kp.getPrivate();

        byte[] ct = Files.readAllBytes(Paths.get("/tmp/ciphertext"));

        Cipher oaepFromInit = Cipher.getInstance("RSA/ECB/OAEPPadding");
        OAEPParameterSpec oaepParams = new OAEPParameterSpec("SHA-256", "MGF1", new MGF1ParameterSpec("SHA-1"), PSpecified.DEFAULT);
        oaepFromInit.init(Cipher.DECRYPT_MODE, privkey, oaepParams);
        byte[] pt = oaepFromInit.doFinal(ct);
    }

}

openssl rsautl -decrypt -inkey prikey.pem -oaep -in ciphertext -out plaintext

Java 代码抛出错误:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: too much data for RSA block
    at org.bouncycastle.jcajce.provider.asymmetric.rsa.CipherSpi.engineDoFinal(Unknown Source)
    at javax.crypto.Cipher.doFinal(Cipher.java:1966)
    at cryptotest.CryptoTest.main(CryptoTest.java:47)

OpenSSL 说:

RSA operation error
140258189264528:error:0406506C:rsa routines:RSA_EAY_PRIVATE_DECRYPT:data greater than mod len:rsa_eay.c:518:

可能是什么问题?

最佳答案

需要将编码消息保留为二进制编码:

fs.writeFileSync('密文', 加密, {encoding: '二进制'});

关于java - 无法解密 Forge 加密的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35060372/

相关文章:

java - XML 解析错误

java - 架构 微服务 Jhipster

node.js - s3.putObject() 在监听 httpDownloadProgress 事件时阻塞服务器

c - 如何编译同时适用于 libcrypto.so.0.9.8 和 libcryto.so.1.0.0 的二进制文件?

c++ - 如何在没有 p、q 等的情况下加载 RSA key 对

php - CakePHP SwiftMailer SMTP TLS OpenSSL 错误 SSL3_GET_RECORD :wrong version number

java - Hadoop作业在通过终端运行时未映射任何输出,但在Eclipse中运行良好

java - 无法从dbf文件中读取字符串(但可以正确读取Number类型数据)Java、DBFReader

node.js - SequelizeJS 中的虚拟属性不起作用

node.js - 使用异步/等待的 mongodb 连接 - NodeJS