当前位置: 首页 > 知识库问答 >
问题:

解密字符串生成IllegalBlockSizeException

朱梓
2023-03-14

我在处理decrypt方法时有问题。加密会产生正确的输出,但当我解密完全相同的加密字符串(应该返回明文字符串)时,它就不起作用了。

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

public class Samp {

    private static String IV = "aaaaaaaaaaaaaaaa";
    private static final String UNICODE_FORMAT = "UTF8";

    private String padd(String plaintext) {
        while (plaintext.length() % 16 != 0) {
            plaintext += "\0";
        }
        return plaintext;
    }

    public String encryptString(String plaintext, String encryptionKey) {
        try {
            byte[] cipher = encrypt(padd(plaintext), encryptionKey);
            return new String(cipher, UNICODE_FORMAT);
        } catch (Exception ex) {
            ex.printStackTrace();
        }

        return null;
    }

    public String decryptString(String encString, String encryptionKey) {
        try {
            System.out.println("**** decryptString ****");
            System.out.println("enc = " + encString);
            System.out.println("key = " + encryptionKey);

            String decrypted = decrypt(encString.getBytes(UNICODE_FORMAT), encryptionKey);
            return decrypted;
        } catch (Exception ex) {
            ex.printStackTrace();
        }

        return null;
    }

    private static byte[] encrypt(String plainText, String encryptionKey) throws Exception {
        Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding", "SunJCE");
        SecretKeySpec key = new SecretKeySpec(encryptionKey.getBytes(UNICODE_FORMAT), "AES");
        cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(IV.getBytes(UNICODE_FORMAT)));
        return cipher.doFinal(plainText.getBytes(UNICODE_FORMAT));
    }

    private static String decrypt(byte[] cipherText, String encryptionKey) throws Exception {
        Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding", "SunJCE");
        SecretKeySpec key = new SecretKeySpec(encryptionKey.getBytes(UNICODE_FORMAT), "AES");
        cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(IV.getBytes(UNICODE_FORMAT)));
        return new String(cipher.doFinal(cipherText), UNICODE_FORMAT);
    }
    // implement methods here
    // using AES simple encryption

    public static void main(String[] args){
        String plaintext = "Hello World!";
        String key = "asdfqaqwsaerdqsw";

        Samp s = new Samp();
        String enc = s.encryptString(plaintext, key);
        System.out.println("encrypted string = " + enc);
        String dec = s.decryptString(enc, key);
        System.out.println("decrypted string = " + dec);
    }
}

我已经看过这个帖子了,跟我的问题一样。我遵循了建议(更改getBytes()->getBytes(UNICODE_FORMAT)),但它仍然是一样的。我仍然得到一个异常(javax.crypto.IllegalBlocksizeException:输入长度不是16字节的倍数)

共有1个答案

姚麒
2023-03-14
  public String encryptString(String plaintext, String encryptionKey)

问题就在这里。字符串不是二进制数据的容器。这个方法应该返回一个byte[]。类似地,decrypt()方法应该采用byte[]作为密文参数,而不是字符串。

 类似资料:
  • V1.1.1新增 <?php $string='1324123i412qewrwerqwe'; $string=sp_authcode($string);//解密字符串 echo $string;//输出解密后的字符串 ?>

  • 我得到的输出是: 有人能解释一下是怎么回事吗?我在互联网上看到了很多这样的例子,它们看起来都很好。但在这里,文本没有被解密。 ps:我使用的版本是

  • 我在node.js中运行了以下简单的加密代码: 我也可以解密如下: 这一切都很好。字符串按预期进行加密和解密。但现在我面临着从这个节点解密加密字符串的任务.js代码,用Java。这就是事情出错的地方,我不知道为什么。 对于解密,My Java代码如下所示: 它不起作用。似乎无论我尝试什么,我最终都会在cipher.doFinal()调用中出现一些异常,或者我得到的字符串完全错误。我知道node.j

  • 我感兴趣的是构建一个个人使用的小应用程序,它将使用JavaScript在客户端加密和解密信息。加密的信息将存储在服务器上的数据库中,但不会存储解密的版本。 它不一定要是超级duper安全的,但我想使用一个当前未中断的算法。 理想情况下我可以做一些 生成编码字符串,以及类似于 以后再解码。 到目前为止,我已经看到了以下内容:http://bitwiseshiftleft.github.io/sjcl

  • 问题内容: 我有使用的Iterator的现有代码 带有编译警告 parameterized 我可以更新为通用版本: 但是,是不是有办法“泛型化” 带钥匙? 我找到了这个答案,但是它的建议没有编译 编辑 使用我收到类型安全警告: to conform to Iterator 同样使用Eclipse Infer泛型也不会执行任何代码更改 问题答案: 您提供的链接答案所使用的类别与您使用的类别不同。如果

  • <?php $random=sp_random_string();//不指定位数,默认为6位 echo $random; //或者 $random=sp_random_string(8);//指定返回8位随机字符串 echo $random; ?>