gpt4 book ai didi

java - 使用 Java 的 RSA 加密/解密

转载 作者:搜寻专家 更新时间:2023-11-01 02:27:06 25 4
gpt4 key购买 nike

我正在编写一个简单的程序,使用 Java 中的 RSA 算法进行加密/解密。我创建一个密码对象如下:

//Create a Cipher object
Cipher rsaCipher = Cipher.getInstance("RSA/ECB/NoPadding");

我通过调用加密函数进行加密:

String cipher=encrypt(textByte, pair, rsaCipher);
System.out.println("The Encryption using RSA Algorithm : "+cipher);

解密为:

//Decryption
String plain=decrypt(Base64.decodeBase64(cipher),pair, rsaCipher);
System.out.println("The Decryption using RSA Algorithm : "+plain);

当我显示输出时,解密输出在原文前返回一个长空格: enter image description here

但是,当我将创建 Cipher 对象的代码编辑为: //创建密码对象 密码 rsaCipher = Cipher.getInstance("RSA");

即删除操作模式和填充参数,问题得到解决,输出变为: enter image description here

问题出在哪里。第一种情况(出现空格时),我指定了NoPadding?为什么空格出现在解密的消息中?即使我使用填充,我也不希望发生这种情况。

编辑:这是加密和解密方法:

public static String encrypt(byte[] textBytes, KeyPair pair, Cipher rsaCipher) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException
{
//get the public key
PublicKey pk=pair.getPublic();


//Initialize the cipher for encryption. Use the public key.
rsaCipher.init(Cipher.ENCRYPT_MODE, pk);

//Perform the encryption using doFinal
byte[] encByte = rsaCipher.doFinal(textBytes);

// converts to base64 for easier display.
byte[] base64Cipher = Base64.encodeBase64(encByte);

return new String(base64Cipher);
}//end encrypt

public static String decrypt(byte[] cipherBytes, KeyPair pair, Cipher rsaCipher) throws IllegalBlockSizeException, BadPaddingException, InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException
{
//get the public key
PrivateKey pvk=pair.getPrivate();

//Create a Cipher object
//Cipher rsaCipher = Cipher.getInstance("RSA/ECB/NoPadding");

//Initialize the cipher for encryption. Use the public key.
rsaCipher.init(Cipher.DECRYPT_MODE, pvk);

//Perform the encryption using doFinal
byte[] decByte = rsaCipher.doFinal(cipherBytes);

return new String(decByte);

}//end decrypt

最佳答案

您的问题确实与填充有关。安全 RSA 功能需要某种填充,实际上是 PKCS#1 1.5 或 OAEP 填充。此外,需要找到加密明文的开始和结束。

RSA 的模幂是使用大整数执行的。然后将这些操作的结果表示为八位字节串。这些八位字节字符串基本上是整数的大端、无符号、固定长度表示。这些整数用 00 值字节填充(这在 RSA 标准中称为 I2OS 原语)。所以您看到的是模幂运算的结果,00 填充仍然存在。

长话短说,始终使用填充方案。如今,OAEP 会更可取。与混合加密方案一起使用,或使用更高级别的容器格式,如 CMS 或 PGP。

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

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