C#AES 128 CBC(nosalt)产生的结果不同于OpenSSL AES -128 -CBC -Nosalt



我有一个来自第三方的加密示例,我需要与...

集成

我应该向他们发送加密消息,他们确实在其结束时解密并执行所需的操作。

他们为我提供了一个示例,这就是他们期望将字符串加密的方式。

echo -n ['字符串到加密'] |OpenSSL ENC -AES -128 -CBC -A -A -NOLASALT -K [HEX中的EncryptionKey]

我给予的Sandbox EncryptionKey hex是313233333333373839

当前,我无法按照以上指定的密钥和iv使用。

然后,我只是用0填充键以匹配32个字节,然后将IV截断以匹配16字节。

然后我能够至少运行代码,但是我的C#代码中的加密字符串无法在OpenSSL上解密。

以下是我的代码。

public static string EncryptString(string plainText, string password)
    {
        byte[] key, iv;
        //converting key to hex
        byte[] ba = Encoding.ASCII.GetBytes("0123456789abcdef");
        string encryptionKeyHex = BitConverter.ToString(ba);
        encryptionKeyHex = encryptionKeyHex.Replace("-", "");
        // Padding key hex with zeros to match the size that .Net algo expects
        if (encryptionKeyHex.Length < 32)
        {
            while (encryptionKeyHex.Length < 32)
            {
                encryptionKeyHex += "0";
            }
        }
        var keyBytes = Encoding.ASCII.GetBytes(encryptionKeyHex);
        var ivBytes = Encoding.ASCII.GetBytes("3030303030303030"); // truncated the original IV specified in the question description to match the size.
        iv = ivBytes;
        key = keyBytes;
        var amAes = new AesManaged();
        amAes.Mode = CipherMode.CBC;
        amAes.Padding = PaddingMode.PKCS7;
        amAes.KeySize = 128;
        amAes.BlockSize = 128;
        amAes.Key = key;
         amAes.IV = iv;
        var icTransformer = amAes.CreateEncryptor();
        var msTemp = new MemoryStream();
        var csEncrypt = new CryptoStream(msTemp, icTransformer, CryptoStreamMode.Write);
        var sw = new StreamWriter(csEncrypt);
        sw.Write(plainText);
        sw.Close();
        sw.Dispose();
        csEncrypt.Clear();
        csEncrypt.Dispose();
        byte[] bResult = msTemp.ToArray();
        //var sha = new SHA1CryptoServiceProvider();
        //var result = sha.ComputeHash(bResult);
        string sResult = Convert.ToBase64String(bResult);
        sResult = HttpUtility.UrlEncode(sResult);
        if (System.Diagnostics.Debugger.IsAttached)
        {
            string debugDetails = "";
            debugDetails += "==> INPUT     : " + plainText + Environment.NewLine;
            debugDetails += "==> SECRET    : " + password + Environment.NewLine;
            //debugDetails += "==> SALT      : " + Program.ByteArrayToHexString(salt) + Environment.NewLine;
            debugDetails += "==> KEY       : " + Encoding.ASCII.GetString(amAes.Key) + " (" + amAes.KeySize.ToString() + ")" + Environment.NewLine;
            debugDetails += "==> IV        : " + Encoding.ASCII.GetString(amAes.IV) + Environment.NewLine;
            debugDetails += "==> ENCRYPTED : " + sResult;
            Console.WriteLine(debugDetails);
        }
        return sResult;
    }

输出:

==>输入:{" filter.accession_number.quals":" 0987654321"}

==>秘密:==>键:3031323333333373738390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000来入

==>加密:b2udrjnekfalrdekdldts09lwie4u16zunvwdgi6gkm6gkm6ysarlw4hu6ekjqfyzcfyzc7b

update

已经注意到,在Windows盒上加密时,我们获得了与Linux盒上使用相同方法的不同结果。

在Linux Box上使用OpenSSL,我们得到..

命令:echo -n'{" filter.accession_number.quals":" 0987654321"}'|

结果:mtausb6rykxyf9/rebfq9m1xwr 6q58ffsjptxdnwgs6z3jz3jz8ru 7ysnkuy2p3 ax

加密的字符串正常工作..我能够成功解密它。

在Windows Box上向OpenSSL发出相同的命令时,给了我们..

命令:echo -n'{" filter.accession_number.quals":" 0987654321"}'|

结果:DB9829Q6QX6CPWLKE RS6ZQRJJQAGZ9XK7FBZTAGQSKCCSKCHPCR7EQU7EQUZ3YOJPLC S6YVW4JXQTZOK4JXQTZOOK43F16GW7SPW ==

此字符串不起作用...

您只是忘记解码十六进制;Encoding.ASCII.GetBytes仅获取键和IV的ASCII表示。

在此处检查答案以正确转换为字节(即用StringToByteArray替换Encoding.ASCII.GetBytes)。

这是遇到类似问题的任何人的工作代码样本...@Maarten Bodewes您确实指出了正确的方向,只需要重新安排代码才能使其正常工作。谢谢:)

    public static string EncryptString(string plainText)
    {
        byte[] key, iv;
        byte[] rawKey = Encoding.ASCII.GetBytes("123456789abcdef");
        string encryptionKeyHex = BitConverter.ToString(rawKey);
        byte[] hexKayBytes = FromHex(encryptionKeyHex); // convert to bytes with 'dashes'
        byte[] data = FromHex("30-30-30-30-30-30-30-30-30-30-30-30-30-30-30-30");
        encryptionKeyHex = ByteArrayToHexString(hexKayBytes);
// modifying key size to match the algorithm validation on key size
        if (encryptionKeyHex.Length < 32)
        {
            while (encryptionKeyHex.Length < 32)
            {
                encryptionKeyHex += "0";
            }
        }
        var ivOriginal = BitConverter.ToString(data);
        ivOriginal = ivOriginal.Replace("-", "");
        if (ivOriginal.Length < 16)
        {
            while (ivOriginal.Length < 16)
            {
                ivOriginal += "0";
            }
        }            
        var keyBytes = StringToByteArray(encryptionKeyHex);
        var ivBytes = StringToByteArray(ivOriginal);
        iv = ivBytes;
        key = keyBytes;
        var amAes = new AesManaged();
        amAes.Mode = CipherMode.CBC;
        amAes.Padding = PaddingMode.PKCS7;
        amAes.KeySize = 128;
        amAes.BlockSize = 128;
        amAes.Key = key;
         amAes.IV = iv;
        var icTransformer = amAes.CreateEncryptor();
        var msTemp = new MemoryStream();
        var csEncrypt = new CryptoStream(msTemp, icTransformer, CryptoStreamMode.Write);
        var sw = new StreamWriter(csEncrypt);
        sw.Write(plainText);
        sw.Close();
        sw.Dispose();
        csEncrypt.Clear();
        csEncrypt.Dispose();
        byte[] bResult = msTemp.ToArray();
        string sResult = Convert.ToBase64String(bResult);
        if (System.Diagnostics.Debugger.IsAttached)
        {
            string debugDetails = "";
            debugDetails += "==> INPUT     : " + plainText + Environment.NewLine;
            debugDetails += "==> SECRET    : " + password + Environment.NewLine;
            //debugDetails += "==> SALT      : " + Program.ByteArrayToHexString(salt) + Environment.NewLine;
            debugDetails += "==> KEY       : " + Encoding.ASCII.GetString(amAes.Key) + " (" + amAes.KeySize.ToString() + ")" + Environment.NewLine;
            debugDetails += "==> IV        : " + Encoding.ASCII.GetString(amAes.IV) + Environment.NewLine;
            debugDetails += "==> ENCRYPTED : " + sResult;
            Console.WriteLine(debugDetails);
        }
        return sResult;
    }
    public static byte[] FromHex(string hex)
    {
        hex = hex.Replace("-", "");
        byte[] raw = new byte[hex.Length / 2];
        for (int i = 0; i < raw.Length; i++)
        {
            raw[i] = Convert.ToByte(hex.Substring(i * 2, 2), 16);
        }
        return raw;
    }
    private static string ByteArrayToHexString(byte[] bytes)
    {
        StringBuilder sbHex = new StringBuilder();
        foreach (byte b in bytes)
            sbHex.AppendFormat("{0:x2}", b);
        return sbHex.ToString();
    }
    public static byte[] StringToByteArray(String hex)
    {
        int NumberChars = hex.Length;
        byte[] bytes = new byte[NumberChars / 2];
        for (int i = 0; i < NumberChars; i += 2)
            bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);
        return bytes;
    }

最新更新