[英]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.