代码之家  ›  专栏  ›  技术社区  ›  jrn

将SSL转换为本机加密#

  •  0
  • jrn  · 技术社区  · 5 年前

    我有一个遗留应用程序,它使用OpenSSL加密字符串 DES3

    OpenSSL enc -des3 -nosalt -a -A -iv 1234567890123456 -K 1234567890123456...48
    

    关键是 一串 属于 48位 iv是第一个的子串 这把钥匙的钥匙。

    现在,我正试图用C来复制这个功能 System.Cryptography 如果可能,不使用OpenSSL。

    我的目标是不必使用OpenSSL并用本机C代码进行加密。

    到目前为止,我得到的是:

    public string Encrypt(string toEncrypt, bool useHashing)
    {
        var _key = "48...digits...";
        byte[] keyArray;
        var toEncryptArray = Encoding.UTF8.GetBytes(toEncrypt);
    
        if (useHashing)
        {
            var hashmd5 = new MD5CryptoServiceProvider();
            keyArray = hashmd5.ComputeHash(Encoding.UTF8.GetBytes(_key));
    
            hashmd5.Clear();
        }
        else
        {
            keyArray = Encoding.UTF8.GetBytes(_key);
        }
    
        var tdes = new TripleDESCryptoServiceProvider();
    
        tdes.Key = keyArray;
    
        // Is this even the correct cipher mode?
        tdes.Mode = CipherMode.CBC;
    
        // Should the PaddingMode be None?
        tdes.Padding = PaddingMode.PKCS7;
    
        // THIS is the line where I am currently stuck on:
        tdes.IV = Encoding.UTF8.GetBytes(_key.Substring(0, 16));
    
        var cTransform = tdes.CreateEncryptor();
    
        var resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
    
        return Convert.ToBase64String(resultArray, 0, resultArray.Length);
    }
    

    16 bytes 但只是 8 bytes

    而且,我已经尝试过我的运气了,有没有散列键/iv。

    有没有可能把上面提到的OpenSSL逻辑转换成纯C?

    0 回复  |  直到 5 年前
        1
  •  2
  •   Topaco    5 年前

    必须为指定密钥和IV openssl enc 具有 -K -iv 作为 价值观。这在C代码中缺少,因此基本上以下表达式

    tdes.Key = Encoding.UTF8.GetBytes(_key);
    tdes.IV = Encoding.UTF8.GetBytes(_key.Substring(0, 16));
    

    必须用

    tdes.Key = StringToByteArray(_key);
    tdes.IV = StringToByteArray(_key.Substring(0, 16));
    

    产生相同的密文 useHashing == false . 在这里 StringToByteArray here

    还应该注意,.NET不接受 weak ,例如:

    123456789012345612345678901234561234567890123456
    

    如果是这样的钥匙 CryptographicException 指定的密钥是'TripleDES'的已知弱密钥,无法使用 ). OpenSSL接受这个密钥。

    • MD5现在不应该用来生成密钥,更多 here .
    • 另外,MD5生成一个16字节的哈希。因此,始终使用键控选项2,它比键控选项1弱( Keying options
    • 一般来说,把钥匙当作静脉注射是不安全的 here .
    • 与今天的标准AES相比,TripleDES速度较慢,更多 here