我有一个 C# 加密应用程序我的部分文件(因为它们是大文件)使用 RijndaelManaged。因此,我将文件转换为字节数组并仅加密其中的一部分。
然后我想使用Java解密该文件。所以我必须解密仅文件的一部分(指那些字节)在 C# 中加密。
问题来了。因为在 C# 中我们有无符号字节在 Java 中我们有有符号字节。所以我的加密和解密不能按我想要的方式工作。
在 C# 中,我将加密字节和普通字节连接在一起,并将它们保存为File.WriteAllBytes
。所以我不能使用sbyte在这里或者我不知道该怎么做:
byte[] myEncryptedFile = new byte[myFile.Length];
for (long i = 0; i < encryptedBlockBytes.Length; i++)
{
myEncryptedFile[i] = encryptedBlockBytes[i];
}
for (long i = encryptedBlockBytes.Length; i < myFile.Length; i++)
{
myEncryptedFile[i] = myFileBytes[i];
}
File.WriteAllBytes(@"C:\enc_file.big", myEncryptedFile);
(Java中有完全相同的解密代码)
所以我的问题是:
- 有没有写入所有字节 in C#?
- 或者我可以使用无符号字节在Java中?
- 或者还有其他方法可以解决我的问题吗?
尽管不能在 Java 中使用无符号字节,但您可以忽略该问题。
AES - 以及所有现代对称密码 - 对字节进行操作,并且输入和输出已定义为字节(或八位字节)。输入和输出已由 NIST 标准化,并且可以使用测试向量。
如果您查看字节的单独位内容,则{200,201,202}
在 C# 中和{(byte)200, (byte)201, (byte)202}
在Java中是相同的。这是因为 Java 使用二进制补码表示字节。
拿号码200
作为整数:这将是11010000
以二进制表示,表示数字-56
在 Java 中,如果在两个补码中用于(有符号)字节。现在对称密码将简单地将这些位转换为另一个位(通常使用完整的block位)。
一旦你检索到答案,你会发现它们在 C# 和 Java 中是相同的当你查看各个单独的位时。然而,C# 会将它们解释为无符号值,而 Java 会将其解释为有符号值。
如果你想在 Java 中打印或使用这些值作为有符号数,那么你必须将它们转换为正有符号整数。执行此操作的方法是使用int p = b & 0xFF
.
这将执行以下操作(我将再次使用数字 200):
-
(负)字节值扩展为有符号整数,记住符号位:
11010000
变成11111111 11111111 11111111 11010000
-
该值被“屏蔽”为0xFF
or 00000000 00000000 00000000 11111111
通过执行二元 AND 运算符:
11111111 11111111 11111111 11010000 & 00000000 00000000 00000000 11111111 = 00000000 00000000 00000000 11010000
该值与值相同200
作为有符号整数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)