gpt4 book ai didi

java - RSA加密Javascript和解密Java

转载 作者:行者123 更新时间:2023-11-29 05:23:14 25 4
gpt4 key购买 nike

用不同的组合花了将近 2 天的时间。我正在使用 RSA 算法在 java 中生成一个非对称 key 对(公钥和私钥),并尝试在 javascript 中使用公钥加密一些文本并在服务器端用 java 解密。我在尝试解密回用 javascript 加密的字符串时收到“javax.crypto.IllegalBlockSizeException:数据不得超过 128 字节”异常。会很感激一些帮助...

使用 Javascript 库进行加密。

https://github.com/wwwtyro/cryptico

var publicKeyString = ""//java生成base64编码的公钥字符串

这是我的javascript代码

var EncryptionResult = cryptico.encrypt("somestring", publicKeyString);
console.log("Encrypted status-"+EncryptionResult.status);
console.log("Encrypted String-"+EncryptionResult.cipher);

字符串加密成功

Java key 生成和解密

Cipher cipher = Cipher.getInstance("RSA");  
KeyFactory fact = KeyFactory.getInstance("RSA");
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(1024); // 1024 used for normal

KeyPair keyPair = keyPairGenerator.generateKeyPair();
PublicKey publicKey = keyPair.getPublic();
PrivateKey privateKey = keyPair.getPrivate();

FileOutputStream fos = null;
ObjectOutputStream oos = null;

将私钥存储在解密方法中用于解密的文件中的代码。

  RSAPrivateKeySpec rsaPrivKeySpec = fact.getKeySpec(privateKey, 
RSAPrivateKeySpec.class);
System.out.println("Writing private key...");
fos = new FileOutputStream(PRIVATE_KEY_FILE);
oos = new ObjectOutputStream(new BufferedOutputStream(fos));
oos = new ObjectOutputStream(new BufferedOutputStream(fos));
oos.writeObject(rsaPrivKeySpec.getModulus());
oos.writeObject(rsaPrivKeySpec.getPrivateExponent());
oos.close();

解密方法

public String decrypt(String ciphertext)   
throws IllegalBlockSizeException, BadPaddingException, InvalidKeyException
{
if (ciphertext.length() == 0) return null;
byte[] dec = org.apache.commons.codec.binary.Base64.decodeBase64(ciphertext);
try {
System.out.println("Private Key file name----"+PRIVATE_KEY_FILE);
privateKey = readPrivateKeyFromFile(PRIVATE_KEY_FILE);
} catch (IOException e) {
e.printStackTrace();
}
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] decrypted = cipher.doFinal(dec);
return new String(decrypted, PLAIN_TEXT_ENCODING);
}

//reading private key from file

public PrivateKey readPrivateKeyFromFile(String fileName)
throws IOException {
FileInputStream fis = null;
ObjectInputStream ois = null;
try {
fis = new FileInputStream(new File(fileName));
ois = new ObjectInputStream(fis);
System.out.println("Private Key file-"+fileName);

BigInteger modulus = (BigInteger) ois.readObject();
BigInteger exponent = (BigInteger) ois.readObject();

// Get Private Key
RSAPrivateKeySpec rsaPrivateKeySpec = new RSAPrivateKeySpec(modulus, exponent);
KeyFactory fact = KeyFactory.getInstance("RSA");
PrivateKey privateKey = fact.generatePrivate(rsaPrivateKeySpec);
return privateKey;
} catch (Exception e) {
e.printStackTrace();
} finally {
if (ois != null) {
ois.close();
if (fis != null) {
fis.close();
}
}
}
return null;
}

最佳答案

Cryptico文档来看,它似乎不是一个简单的RSA加密,而是一个复杂的操作,生成AES key ,用RSA加密它,用AES加密数据并输出一个加密的串联AES key 和加密数据。如果你想用 Java 解密它,你必须检查 Cryptico 源代码并用 Java 重新实现它。

至于您当前的尝试和 javax.crypto.IllegalBlockSizeException: Data must not be longer than 128 bytes 错误:

当您未指定完整转换时,RSA 的默认 JCE 转换为 RSA/ECB/PKCS1Padding .

在这种模式下,RSA 加密或解密单个数据 block ,其长度不大于 key 的大小(更具体地说,如果输入的字节序列被解释为一个大整数,它的值应该小于RSA 使用的模数)。您可以在 this 中找到更多信息。和 this问题。

对于 1024 位的 key 大小,最大数据大小为 128 字节,这正是异常所说的,因为 Cryptico 的输出显然不是单个 RSA block 并且它的长度更大“普通”RSA 所期望的。在这种情况下,尝试在 Java 中使用其他一些密码模式或填充模式也无济于事。

关于java - RSA加密Javascript和解密Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23818842/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com