【问题标题】:Can't decrypt Forge-encrypted data无法解密 Forge 加密的数据
【发布时间】:2016-01-28 11:32:50
【问题描述】:

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

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:

可能是什么问题?

【问题讨论】:

  • Java 端从十六进制转换为二进制失败。
  • @JamesKPolk 为什么要对数据进行十六进制处理?它只是控制台输出中的十六进制
  • 哦,我错过了,对不起。出于某种原因,您的 ct 数组太长了。我真的不知道 forge,所以我不能确定发生了什么。
  • 试试这个:fs.writeFileSync('ciphertext', encrypted, {encoding: 'binary'});
  • @stdob-- 行得通,你能发布答案吗?谢谢

标签: java node.js openssl rsa pkcs#1


【解决方案1】:

编码消息需要保持二进制编码:

fs.writeFileSync('ciphertext', encrypted, {encoding: 'binary'});

【讨论】:

  • 运行问题的脚本,如上修复,然后$ openssl rsautl -decrypt -inkey prikey.pem -oaep -in ciphertext -out plaintext,我有错误信息:RSA operation error 140004996825536:error:04099079:rsaroutines:RSA_padding_check_PKCS1_OAEP_mgf1:oaep 解码错误:.. /crypto/rsa/rsa_oaep.c:245: 140004996825536:error:04065072:rsa 例程:rsa_ossl_private_decrypt:padding check failed:../crypto/rsa/rsa_ossl.c:485: OpenSSL 1.1.1 node-forge: "version" :“0.10.0”
猜你喜欢
  • 1970-01-01
  • 2013-09-03
  • 1970-01-01
  • 1970-01-01
  • 2020-04-07
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多