【问题标题】:C# Unsigned bytes Encryption to Java Signed bytes DecryptionC# 无符号字节加密到 Java 有符号字节解密
【发布时间】:2013-07-19 05:19:04
【问题描述】:

我有一个使用 RijndaelManaged 加密 我的部分文件(因为它们是大文件)的 C# 应用程序。所以我将我的文件转换为字节数组并只加密其中的一部分。

然后我想使用 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中也有完全相同的解密代码)

所以我的问题是:

  • C# 中有 WriteAllsBytes 吗?
  • 或者我可以在 Java 中使用 unsigned bytes 吗?
  • 或者我的问题的任何其他解决方案?

【问题讨论】:

  • stackoverflow.com/questions/4266756/… 可能你可以将其转换为无符号
  • 我以前检查过。不幸的是,它没有帮助。
  • 这可能是相关的:stackoverflow.com/a/11039059/1149773@Natasha:简而言之:就这样使用它。
  • 就像你写的那样。如果你想代表{200, 201, 202},那么写{(byte)200, (byte)201, (byte)202},这与&amp; 0xFF相反。当然不要超过 255,因为这些值不适合一个字节。
  • 您是否真的在 Java 中尝试过,使用有符号字节?您在编写文件时遇到任何问题吗?如果符号对您来说是个问题,请尝试以十六进制而不是符号数字来检查您的数据。

标签: c# java cryptography unsigned signed


【解决方案1】:

虽然你不能在 Java 中使用无符号字节,但你可以直接忽略这个问题。

AES - 以及所有现代对称密码 - 对字节进行操作,输入和输出被定义为字节(或八位字节)。输入和输出已通过 NIST 标准化,并提供测试向量。

如果您查看字节的单独位内容,则 C# 中的 {200,201,202} 和 Java 中的 {(byte)200, (byte)201, (byte)202} 是相同的。这是因为 Java 使用字节的二补码表示。

将数字200 作为整数:这将是二进制的11010000,如果在两个补码的(有符号)字节中使用,则表示Java 中的数字-56。现在对称密码将简单地将这些位转换为另一个(通常使用完整的位)。

一旦您检索到答案,当您查看单独的位时,您会发现它们在 C# 和 Java 中是相同的。然而,C# 会将它们解释为无符号值,而 Java 将解释为有符号值。

如果你想在 Java 中打印或使用这些值作为有符号数字,那么你必须将它们转换为正符号整数。这样做的方法是使用int p = b &amp; 0xFF

执行以下操作(我将再次使用数字 200):

  1. (负)字节值扩展为有符号整数,记住符号位:

    11010000 变为 11111111 11111111 11111111 11010000

  2. 通过执行二元与运算符,该值被0xFF00000000 00000000 00000000 11111111“屏蔽”:

    11111111 11111111 11111111 11010000 &amp; 00000000 00000000 00000000 11111111 = 00000000 00000000 00000000 11010000

此值与值200 相同,为有符号整数。

【讨论】:

  • 虽然我已经找到了在 C# 中使用 BinaryWriter.Write(SByte) 的解决方案,但你的答案值得一试。感谢您提供信息。
猜你喜欢
  • 1970-01-01
  • 2013-05-12
  • 1970-01-01
  • 2019-01-26
  • 2011-10-21
  • 2013-12-05
  • 1970-01-01
  • 2015-01-17
  • 1970-01-01
相关资源
最近更新 更多