繁体   English   中英

通过IV进行AES 256加密

[英]AES 256 encryption by passing IV

我很累将编码逻辑转换为用C#编写的Java。 我通过自定义IV作为参数。

 private static byte[] iv = new byte[] { 116,209,63,154,85,66,37,82,96,104,131,192,103,140,125,176 };

但是,在Java中,字节数组中不能容纳128个以上的字节。 在C#中是可能的。

        this.secretKeySpec = new SecretKeySpec(key, "AES");
        this.iv = new IvParameterSpec(iv);
        this.cipher = Cipher.getInstance(ALGORITHM_AES256);

在javax.crypto中,IvParameterSpec构造仅允许字节数组为“ iv”。 任何人都可以帮忙传递byte []以上作为java中的iv参数。

问题是Java不支持unsigned数据类型 ,而.NET则支持。

无符号字节是从0到255。这是.NET 字节结构
带符号的字节从-128到127。这是Java 字节原始数据类型或.NET SByte结构。

.Net代码中的数据将iv存储为无符号值,而Java代码不允许您直接执行。

解决方案:

1)您可以从.NET代码的每个字节中手动减去128,从而使其表示相同的位模式(IV只是位序列-不管它们存储为有符号值还是无符号值-都是位必须匹配):

byte[] iv = new byte[] { -8, 81, ...};

2)或者,您可以将相同的数据存储在int数据类型数组中,然后使用以下代码将其转换为字节值。

int[] ivInInts = new int[] { 116,209,63,154,85,66,37,82,96,104,131,192,103,140,125,176 };

byte[] iv = new byte[ivInInts.getLength()];

for (int i = 0; i < ivInInts.getLength(); i++)
   iv = (byte)(ivInInts[i] - 128);

编辑:

如果您对数字的二进制等效性有疑问,可以阅读二进制补码

65 = 0100 0001作为无符号字节= 0100 0001作为有符号字节
-65 =无法表示为无符号字节= 1011 1111为有符号字节
193 = 1011 1111为无符号字节=不能表示为有符号字节

替代Eugene的建议:只需将所有值(或大于127的值)显式转换为byte 对二进制数据使用十六进制也是一个好主意。

byte[] test = new byte[] { 0, (byte) 0, 0x00, (byte) 0x00, (byte) 128, (byte) 0x80, (byte) 256, (byte) 0x100 };

请注意-由于最后两个字节的值应该清楚-这确实允许您指定超出范围的值而不会发出警告。

另外,您可以使用十六进制或base64解码器,因此可以使用字符串创建更密集的字节数组表示形式。

暂无
暂无

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

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