当前位置: 首页 > 面试题库 >

C#无符号字节加密到Java有符号字节解密

阴元青
2023-03-14
问题内容

我在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中有完全相同的解密代码)

所以我的问题是:

  • C#中是否有任何 WriteAllsBytes
  • 还是可以在Java中使用 无符号字节
  • 或其他解决我的问题的方法?

问题答案:

尽管您不能在Java中使用无符号字节,但是您可以简单地忽略该问题。

AES和所有现代对称密码都以字节为单位,并且输入和输出已定义为字节(或八位位组)。输入和输出已通过NIST进行了标准化,并且可以使用测试向量。

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

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

找到答案后, 当您查看单独的位时 ,您会发现它们在C#和Java中都是相同的。但是,C#将把它们解释为无符号值,将Java解释为有符号值。

如果要打印或将这些值用作Java中的带符号数字,则必须将它们转换为带正符号的整数。做到这一点的方法是使用int p = b & 0xFF

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

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

11010000 变成 11111111 11111111 11111111 11010000

  1. 使用0xFF00000000 00000000 00000000 11111111通过执行二进制AND运算符可“屏蔽”此值:

11111111 11111111 11111111 11010000 & 00000000 00000000 00000000 11111111 = 00000000 00000000 00000000 11010000

该值与200带符号整数的值相同。



 类似资料:
  • 问题内容: 在Java中,是否有一种简单而优雅的方法将无符号字节值转换为有符号字节值?例如,如果我所拥有的只是int值240(二进制(24位+ 11110000)= 32bits),如何获得该int的带符号值? 问题答案: 除了,Java没有其他无符号值。考虑以下代码段: 结果将为-1,因为最低的8位已复制到byte变量中。

  • 问题内容: 我需要使用无符号字节数组。我需要通过网络将某些字符发送到服务器,其中一些字符大于127。 我有下面的代码的简化版本,以尝试理解该概念: 这给出了以下输出: 我需要打印160。由于服务器期望一个160的字节,并且如果它接收到-96,则它不接受该值。我使用int的原因是,当我阅读如何解决该问题时,我经常碰到使用int的建议,但是我不太理解,因为我需要数组为byte类型。 这是我发送数组的代

  • 问题内容: Java中的字节默认为带符号的。我在其他帖子上看到具有无符号字节的解决方法类似于以下内容: 有人可以向我解释为什么这样做有效,并将有符号字节转换为无符号字节,然后将其转换为整数吗?具有11111111的字节导致相同的字节-对吗? 问题答案: 类型转换的优先级高于运算符。因此,您首先要转换为一个int,然后再进行ANDing以掩盖所有已设置的高阶位,包括java所用的二进制补码表示法的“

  • 我正在与Scribbler2机器人和Fluke2板工作,并通过Java中的Myro与Fluke沟通。Fluke board是Scribbler和用Java编写的桌面客户端之间的蓝牙通信桥梁。它通过一个RS232串口与涂写器通信。 这可能是一个愚蠢的问题,上面的系统很复杂,所以如果我不能很好地解释这一点,请原谅我。 我的问题的背景:Java使用有符号字节。Fluke是(我想)用C写的,所以使用了无符

  • 我在写JNI。在这种情况下,我的Java程序使用ByteOutputStream()获取一个图像字节数组,然后用这个数组调用C中的一个函数,将字节数组转换为无符号char*。代码如下: 在这一点上,当我编译时,我不断收到警告: 警告:使用“jbyte *”类型的表达式(也称为“signed char *”)初始化“unsigned char *”会在指向具有不同符号[-Wpointer-sign]

  • 问题内容: 我想了解如何将带符号的数字转换为无符号的数字。 可以说我有这个: 为了使其无符号,我必须选择“更大”的数据类型“ short”,并应用值为0x00ff的AND运算符。 为什么使数字无符号? 问题答案: Java实际上没有无符号原语。 值127实际上由“ 01111111”表示,第一位是符号(0为正)。 一个无符号字节将能够保存0到255的值,但是127是有符号字节的最大值。由于一个字节