gpt4 book ai didi

java - IllegalBlocksizeException - 如何使用Base64解决

转载 作者:行者123 更新时间:2023-12-01 16:53:29 24 4
gpt4 key购买 nike

我在使用以下代码时遇到了一些问题 - 我似乎收到了 IllegalBlocksizeException 并且不确定我在这里可能做错了什么?可以获得一些建议/指示吗?

谢谢

    public class Encryption
{
private SecretKeyFactory factory;
private SecretKey tmp;
private SecretKey secret;
private Cipher cipher;

private byte[] iv;
private byte[] cipherText;

private final KeySpec spec = new PBEKeySpec("somepassword".toCharArray(), SALT, 65536, 256);
private static final byte[] SALT = {(byte)0xc3, (byte)0x23, (byte)0x71, (byte)0x1c, (byte)0x2e, (byte)0xc2, (byte)0xee, (byte)0x77};

public Encryption()
{
try
{
factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
tmp = factory.generateSecret(spec);
secret = new SecretKeySpec(tmp.getEncoded(), "AES");
cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secret);
iv = cipher.getParameters().getParameterSpec(IvParameterSpec.class).getIV();
}
catch (Exception e)
{
e.printStackTrace();
}
}

public String encrypt(String valueToEncrypt) throws Exception
{
cipher.init(Cipher.ENCRYPT_MODE, secret, new IvParameterSpec(iv));
cipherText = cipher.doFinal(Base64.decodeBase64(valueToEncrypt.getBytes()));
return Base64.encodeBase64String(cipherText);
}

public String decrypt(String encryptedValueToDecrypt) throws Exception
{
cipher.init(Cipher.DECRYPT_MODE, secret, new IvParameterSpec(iv));
return new String(cipher.doFinal(new Base64().encode(encryptedValueToDecrypt.getBytes())));
}

public static void main(String[] args ) throws Exception
{
Encryption manager = new Encryption();
String encrypted = manager.encrypt("this is a string which i would like to encrypt");
System.out.println(encrypted);
String decrypted = manager.decrypt(encrypted);
System.out.println(decrypted);
System.out.println(encrypted.equals(decrypted));
}
}

异常情况如下

Exception in thread "main" javax.crypto.IllegalBlockSizeException: Input length must be multiple of 16 when decrypting with padded cipher
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:750)
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:676)
at com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:313)
at javax.crypto.Cipher.doFinal(Cipher.java:2087)
at encrypt.Encryption.decrypt(Encryption.java:52)
at encrypt.Encryption.main(Encryption.java:60)

最佳答案

从功能的角度来看,开始实现加密算法的唯一方法(请记住,工作代码不一定是安全的,并且应该朝这个方向思考)增量:首先尝试使用固定 key 的原始 AES,然后添加 PBKDF2 生成的 key ,然后添加 Base64。后者只是一个编码工具,应该是该过程中最简单的部分。

但是让我们看一下代码:1. 如果您的目标是从密码生成 key ,那么初始化似乎没问题。2.在解密过程中,这一行会消失:

 cipherText = cipher.doFinal(Base64.decodeBase64(valueToEncrypt.getBytes()));

valueToEncrypt 是一个可读字符串,但您正在尝试解密它。由于它只有小写字母和空格,因此可能不会触发错误,但您正在尝试对尚未进行 Base64 编码的内容进行 Base64 解码。尝试一下会更有意义:

cipherText = cipher.doFinal(valueToEncrypt.getBytes());

然后密文可以进行base64编码。

对于解密部分,以相反的顺序撤消加密中的操作。如果您加密然后进行 Base64 编码,则先进行 Base64 解码,然后再解密。

最后的建议是:考虑模块化。在一行中编码并在另一行中加密,因此如果您想删除或添加一层,您只需切换一行上的注释即可。

关于java - IllegalBlocksizeException - 如何使用Base64解决,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35996036/

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