java - Java 中的加密我需要一个 16 字节的初始 vector

标签 java encryption aes

您好,我正在尝试使用带有初始 vector 和 key 的 AES 加密来加密字符串。问题是我无法生成 16 字节长的 IV。无论我做什么,它显示的 IV 都不是 16 字节,因此会引发异常。

 public static String encryptString(String str){
        char[] CHARSET_AZ_09 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".toCharArray();
        String initialVectorString = Helper.randomString(CHARSET_AZ_09, 16);
        byte[] vectorbytes = (new org.apache.commons.codec.binary.Base64()).encode(initialVectorString.getBytes());

        String encryptedString = Helper.encrypt(str, initialVectorString, "mykey");
        return encryptedString;
    }
    public static String randomString(char[] characterSet, int length) {
        Random random = new SecureRandom();
        char[] result = new char[length];
        for (int i = 0; i < result.length; i++) {
            // picks a random index out of character set > random character
            int randomCharIndex = random.nextInt(characterSet.length);
            result[i] = characterSet[randomCharIndex];
        }
        String str = new String(result);
        try{
            str = new String(str.getBytes(),"UTF8");
        }
        catch(Exception e){

        }
        Log.d("check",str.getBytes().length+"");
        return str;
    }
    public static String encrypt(String data,String initialVectorString,String secretKey){
        String encryptedString = null;
        try{
             SecretKeySpec skeySpec = new SecretKeySpec(md5(secretKey).getBytes(), "AES");
             IvParameterSpec initialVector = new IvParameterSpec((new org.apache.commons.codec.binary.Base64()).decode(initialVectorString.getBytes()));
             Cipher cipher = Cipher.getInstance("AES/CFB8/NoPadding");
             cipher.init(Cipher.ENCRYPT_MODE, skeySpec, initialVector);
             byte[] plainTextByteArray = (new org.apache.commons.codec.binary.Base64()).decode(data.getBytes());
             byte[] encryptedByteArray = cipher.doFinal(plainTextByteArray);
             encryptedString = new String(encryptedByteArray, "UTF8");
        }
        catch (Exception e) {
            Log.d("Problem decrypting the data", e.getLocalizedMessage());
        }
        return encryptedString;
    }

有人知道如何生成 16 字节长的 IV 吗?

最佳答案

你是问如何创建一个16字节的数组吗?

byte[] iv = new byte[ 16 ];

当我们在这里时,使用它来填充随机数据:

SecureRandom random = SecureRandom.getInstance( "SHA1PRNG" );
random.nextBytes( iv );

关于java - Java 中的加密我需要一个 16 字节的初始 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22678032/

相关文章:

c - 通过管道在 C 中进行实时流 gpg 加密

c# - 字节数组在 C# 中的编码方式对 AES 的安全性有影响吗?

java - java中如何解密字符串

java - 无法在 protected 站点上启动 Java Web Start

java - Java SQLexecuteQuery 抛出有效 sql 语句错误

Java 通用接口(interface) List<T> 不接受对象类型

java - 更改加密算法

java - 更改 JTable 中某些行的颜色但不是全部

c# - (C#) 在 (EC)DHE x25519 上使用私钥和公钥计算 key 份额

php - 保护我的 PHP 页面免受未经授权的查询