使用Java进行RSA加密/解密

use*_*774 4 java cryptography rsa

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

//Create a Cipher object
Cipher rsaCipher = Cipher.getInstance("RSA/ECB/NoPadding");
Run Code Online (Sandbox Code Playgroud)

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

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

并解密为:

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

当我显示输出时,解密输出在原始文本之前返回一个长空格: 在此输入图像描述

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

即删除操作模式和填充参数,问题得到解决,输出变为: 在此输入图像描述

问题出在哪儿.在第一种情况下(当空间出现时),我指定了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
Run Code Online (Sandbox Code Playgroud)

Maa*_*wes 5

你的问题确实与填充.实际上,某些填充(PKCS#1 1.5或OAEP填充)是安全RSA功能所必需的.此外,需要找到加密纯文本的开头和结尾.

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

长话短说,总是使用填充方案.如今,OAEP将更为可取.与混合加密方案一起使用,或使用更高级别的容器格式,如CMS或PGP.