-1

我正在使用此代码加密字节,我已经从 1-255 字节对其进行了测试,并且值大于 128 的每个字节都被解密为 63

在此处输入图像描述

AEK is a 16char string
public byte[] AE1024(byte[] __test)
    {
        byte[] data = __test;
        byte[] rgbKey = ASCIIEncoding.ASCII.GetBytes(AEK.Substring(0, AEK.Length / 2));
        byte[] rgbIV = ASCIIEncoding.ASCII.GetBytes(AEK.Substring(AEK.Length / 2, AEK.Length / 2));
        MemoryStream memoryStream = new MemoryStream(1024);
        DESCryptoServiceProvider desCryptoServiceProvider = new DESCryptoServiceProvider();
        CryptoStream cryptoStream = new CryptoStream(memoryStream, desCryptoServiceProvider.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
        cryptoStream.Write(data, 0, data.Length);
        cryptoStream.FlushFinalBlock();
        byte[] result = new byte[(int)memoryStream.Position];
        memoryStream.Position = 0;
        memoryStream.Read(result, 0, result.Length);
        cryptoStream.Close();
        memoryStream.Dispose();
        return result;
    }

这是解密方法

public byte[] AD1024(byte[] __test)
    {
        byte[] data =__test;
        byte[] rgbKey = ASCIIEncoding.ASCII.GetBytes(AEK.Substring(0, AEK.Length / 2));
        byte[] rgbIV = ASCIIEncoding.ASCII.GetBytes(AEK.Substring(AEK.Length / 2, AEK.Length / 2));
        MemoryStream memoryStream = new MemoryStream(data.Length+1);
        DESCryptoServiceProvider desCryptoServiceProvider = new DESCryptoServiceProvider();
        ICryptoTransform x = desCryptoServiceProvider.CreateDecryptor(rgbKey, rgbIV);
        CryptoStream cryptoStream = new CryptoStream(memoryStream, x, CryptoStreamMode.Read);
        memoryStream.Write(data, 0, data.Length);
        memoryStream.Position = 0;
        string decrypted = new StreamReader(cryptoStream).ReadToEnd();
        cryptoStream.Close();
        memoryStream.Dispose();
        return Encoding.ASCII.GetBytes(decrypted);
    }
4

2 回答 2

2

您看到 63 的原因是您使用的是 ASCII 编码。编码时任何超过 128 的整数都将变为 63(或?):

static void Main()
{
    byte[] bytes = new[]{(byte)129};

    string asciiString = Encoding.ASCII.GetString(bytes);

    byte[] encodedBytes = Encoding.ASCII.GetBytes(asciiString);

    Console.WriteLine(bytes[0]);
    Console.WriteLine(asciiString);
    Console.WriteLine(encodedBytes[0]);

    Console.ReadLine();
}

上述输出:

129
?
63

由于字节 > 128 与 ASCII 或 Unicode 中的文本不对应,因此我建议@usr 在评论中说您的加密/解密例程已损坏。

于 2013-04-01T21:56:38.117 回答
0

你的解密方法是……有创意……

你为什么使用流阅读器?您的原始加密数据是 byte[] ...不是 string ...

获取解密器

制作一个新的 MemoryStream

使用 CryptoStreamMode.Write 将其包装到一个新的 CryptoStream 中,使用解密器作为 ICryptoTransform

将您的加密字节写入 CryptoStream

掌握 MemoryStreams 缓冲区,它将保存您的明文字节数组

于 2013-04-01T22:08:30.510 回答