首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确解密javax.crypto加密字符串

如何正确解密javax.crypto加密字符串
EN

Stack Overflow用户
提问于 2015-12-20 13:46:06
回答 2查看 2.1K关注 0票数 0

当我试图解密时,我得到了以下错误:

javax.crypto.IllegalBlockSizeException:使用填充密码解密时输入长度必须为16倍

下面是我实现的加密类:

代码语言:javascript
复制
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.SecretKeySpec;

public class StringEncrypter {

    public static String encrypt(String key, String string, String algorithm) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, UnsupportedEncodingException {
        Key aesKey = new SecretKeySpec(key.getBytes("UTF-8"), algorithm);
        Cipher cipher = Cipher.getInstance(algorithm);
        cipher.init(Cipher.ENCRYPT_MODE, aesKey);
        byte[] encrypted = cipher.doFinal(string.getBytes());
        return encrypted.toString();
    }

    public static String decrypt(String key, String encryptedString, String algorithm) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, UnsupportedEncodingException {
        Key aesKey = new SecretKeySpec(key.getBytes("UTF-8"), algorithm);
        Cipher cipher = Cipher.getInstance(algorithm);
        cipher.init(Cipher.DECRYPT_MODE, aesKey);
        String decrypted = new String(cipher.doFinal(encryptedString.getBytes()));
        return decrypted;
    }
}

我就是这样加密一个字符串的:

代码语言:javascript
复制
StringEncrypter.encrypt("0306868080306868", "ddd", "AES"); // [B@e19957c

当我试图像这样解密上面加密的字符串时:

代码语言:javascript
复制
String decrypted = StringEncrypter.decrypt("0306868080306868", "[B@e19957c", "AES");

我拿到illegalBlockSizeException了。

我在上面做错什么了?如何正确解密加密字符串?

EN

回答 2

Stack Overflow用户

发布于 2015-12-20 14:18:04

您需要为您的密钥和密文执行基64编码解码。在Java 8中有一个新的Base64类,您不能只将任何字节存储在字符串中,并不是所有的字节都代表可打印甚至有效的字符,密码的输出与随机没有区别。

此外,字节数组" class“(用[B表示)没有实现toString方法,这意味着您只需要从Object.toString中获取打印,即类名[B和对象实例的人类可读的标识符,而不是实际的密文。

票数 2
EN

Stack Overflow用户

发布于 2015-12-20 16:23:12

不能将字节(二进制)用作字符串。它不是等价物

你应该改信它。几种礼貌。Base64或Hexa,例如,您使用base64,它给出如下内容:

代码语言:javascript
复制
import javax.xml.bind.DatatypeConverter ;

byte[] bt= ... // what you get

// Conversion B64
String encodedb64=DatatypeConverter.printBase64Binary(bt);

// CONVERSION base 64 => byte 
// base 64 => byte
byte [] byteArrayreverse=DatatypeConverter.parseBase64Binary(encodedb64);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34381630

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档