繁体   English   中英

AES256加密

[英]AES256 encryption

我在正确加密AES256中的字符串时遇到困难。 我的要求是它必须是AES256和CBC,并且长度24的IV必须放在加密的字符串之前。 我已经有提供的密钥,它保持不变。

我的密码

   public String encrypt(String value) {


    try {
        SecureRandom secureRandom = new SecureRandom();
        byte[] ivBytes = new byte[16];
        secureRandom.nextBytes(ivBytes);

        SecretKeySpec skeySpec = new SecretKeySpec(byteArray, "AES");

        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec, new IvParameterSpec(ivBytes));

        byte[] encrypted = cipher.doFinal(value.getBytes());

        Log.d("encrypted", String.format("%s", encrypted.length));

        return Base64.encodeToString(ivBytes, Base64.DEFAULT) + Base64.encodeToString(encrypted, Base64.DEFAULT);


    } catch (Exception ex) {
        ex.printStackTrace();
    }

    return null;
}

这里有几个问题。 如果将ivBytes从16更改为24,则会收到一条错误消息,提示预期的iv长度为16而不是24。我也不确定此代码是否在AES256或AES中进行加密。 任何帮助表示赞赏。 顺便说一句,值是一个十六进制,例如,它可能类似于831684e1。 不知道这是否影响加密。

这里有几个问题。 如果将ivBytes从16更改为24,则会收到一条错误消息,提示期望的iv长度为16而不是24。

没错 AES仅以128位/ 16字节的块大小定义。 CBC 需要单个块大小的随机IV。

我也不确定此代码是否在AES256或AES中加密。

我们也不确定,因为未指定byteArray并且Java / Android中的AES实现使用密钥大小在AES-128,-192或-256之间进行选择。 请注意,密钥还应包含随机字节(而不是编码为字节的密码)。 Android很好,但是对于Java,对于较早版本的Java Runtime Environment(JRE),您可能需要Unlimited Crypto文件。

不用说,对于AES-256, byteArray应该为32个字节。

顺便说一句,值是一个十六进制,例如,它可能类似于831684e1。 不知道这是否影响加密。

通常,十六进制表示二进制值。 您最好先解码十六进制值,然后再加密二进制文件。 这将是密文量的一半(并且还将遵守其他开发人员不会感到惊讶的原则)。

当前,您正在使用value.getBytes() ,这意味着您将获得平台特定的十六进制字符编码(对于Android,为UTF-8,但您基本上会获得US-ASCII,因为十六进制始终被编码为每个字符一个字节) 。 换句话说,您将对二进制值进行两次编码,而根本不需要编码。

解决了。 我当时做的是正确的加密,只是我没有意识到Base64在我的字符串后添加了换行符。 这导致网址不正确。 因此,为了解决此问题,我不得不使用Base64.NOWRAP而不是Base64.DEFAULT

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM