AES负字节 - c#

以下是在Java中使用AES加密的摘录:

  encryptedData =   encryptCipher.doFinal(strToEncrypt.getBytes());

以下是C#中的摘录

 DecryptStringFromBytes_Aes(encrypted, myAes.Key, myAes.IV);

两者都使用一个字节数组进行加密,另一个使用字节数组进行解密,Java中的加密会生成字节数组中存储的一些负值。

C#使用字节数组解密,但是C#中的字节被定义为仅包含0..255之间的数字-Java将其字节类型定义为-128至127。

因此,我无法将加密的数据发送到用C#编写的远程应用程序,因为它无法使用从Java应用程序发送的字节数组进行解密。

有没有人想出一种解决方案,可以让我告诉java加密时不要产生负数?

该代码来自Micrsoft,MemoryStream需要byte []为加密代码创建流...
正如是否提到的那样,我用sbyte替换了byte []但无济于事,因为MemoryStream需要byte []

static string DecryptStringFromBytes_Aes(sbyte[] cipherText, byte[] Key, byte[] IV)
    {
        // Check arguments. 
        if (cipherText == null || cipherText.Length <= 0)
            throw new ArgumentNullException("cipherText");
        if (Key == null || Key.Length <= 0)
            throw new ArgumentNullException("Key");
        if (IV == null || IV.Length <= 0)
            throw new ArgumentNullException("Key");

        // Declare the string used to hold 
        // the decrypted text. 
        string plaintext = null;

        // Create an Aes object 
        // with the specified key and IV. 
        using (Aes aesAlg = Aes.Create())
        {
            aesAlg.Key = Key;
            aesAlg.IV = IV;

            // Create a decrytor to perform the stream transform.
            ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);

            // Create the streams used for decryption. 
            using (MemoryStream msDecrypt = new MemoryStream((byte)cipherText))
            {
                using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
                {
                    using (StreamReader srDecrypt = new StreamReader(csDecrypt))
                    {


                        // Read the decrypted bytes from the decrypting stream
                        // and place them in a string.
                        plaintext = srDecrypt.ReadToEnd();
                    }
                }
            }

        }

        return plaintext;


    }

参考方案

Java的字节是有符号的,C#的字节是无符号的(C#中还有一个sbyte类型,没有人使用,它的工作方式类似于Java的字节)。

没关系它们在某些方面有所不同,即

当转换为int时,C#的字节将被零扩展,Java的字节将被符号扩展(这就是为什么在Java中使用字节时几乎总是看到& 0xFF的原因)。
当转换为字符串时,Java的字节将其128-255的范围映射到-128--1。只是忽略这一点。

这些字节的实际值(即它们的位模式)才是真正重要的,无论您将其解释为170(如C#)还是-86(如Java),0xAA的字节都将是0xAA。这是同一件事,只是将其打印为字符串的方式不同。

new MemoryStream((byte)cipherText))绝对不会做正确的事情(或任何事情,甚至都不应编译)。相关的new MemoryStream((byte[])cipherText))也不起作用,您不能在这样的原始数组之间进行转换。 cipherText应该只是一个byte[]开头。

java:继承 - java

有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…

Java:BigInteger,如何通过OutputStream编写它 - java

我想将BigInteger写入文件。做这个的最好方式是什么。当然,我想从输入流中读取(使用程序,而不是人工)。我必须使用ObjectOutputStream还是有更好的方法?目的是使用尽可能少的字节。谢谢马丁 参考方案 Java序列化(ObjectOutputStream / ObjectInputStream)是将对象序列化为八位字节序列的一种通用方法。但…

Java-如何将此字符串转换为日期? - java

我从服务器收到此消息,我不明白T和Z的含义,2012-08-24T09:59:59Z将此字符串转换为Date对象的正确SimpleDateFormat模式是什么? java大神给出的解决方案 这是ISO 8601标准。您可以使用SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM…

Java:从类中查找项目名称 - java

仅通过类的实例,如何使用Java反射或类似方法查找项目名称?如果不是,项目名称(我真正想要的是)可以找到程序包名称吗? 参考方案 项目只是IDE使用的简单组织工具,因此项目名称不是类或JVM中包含的信息。要获取软件包,请使用Class#getPackage()。然后,可以调用Package#getName()将包作为您在代码的包声明中看到的String来获取…

隐藏开源应用程序中使用的API密钥 - java

我目前正在开发基于第三方网络API的桌面应用程序,并且已经为其程序注册并获得了两个访问密钥作为回报。但是,如果将这些键作为字符串粘贴到源代码中,那么任何人都可以拉回存储库的内容并轻松地找到它们。到目前为止,关于如何防止这种情况的最好的想法是将它们分别编译成一个类文件,对其进行模糊处理,然后再使用它,以便至少在源代码中不使用纯文本格式。但是,我是否缺少更好,更…