SSCrypto / OpenSSL到C#加密

时间:2008-11-18 23:46:42

标签: c# .net cocoa encryption openssl

有没有人能够使用SSCrypto Framework for Cocoa加密文本然后在C#/ .NET中解密?或者有人可以提供一些指导吗?

我很确定我的问题与使加密设置正确无关,但我对Cocoa的说法还不够,所以我无法确定库中正在使用哪些设置。然而,我尝试破译它似乎是md5哈希,CBC模式,用零填充,我不知道IV是否设置...

我的C#代码如下所示:

        public static string Decrypt( string toDecrypt, string key, bool useHashing )
    {
        byte[] keyArray;
        byte[] toEncryptArray = Convert.FromBase64String( toDecrypt );

        if( useHashing )
        {
            MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
            keyArray = hashmd5.ComputeHash( UTF8Encoding.UTF8.GetBytes( key ) );
            hashmd5.Clear();
        }
        else
            keyArray = UTF8Encoding.UTF8.GetBytes( key );

        TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
        tdes.Key = keyArray;
        tdes.Mode = CipherMode.CBC;
        tdes.Padding = PaddingMode.Zeros;

        ICryptoTransform cTransform = tdes.CreateDecryptor();
        byte[] resultArray = cTransform.TransformFinalBlock( toEncryptArray, 0, toEncryptArray.Length );

        tdes.Clear();

        return UTF8Encoding.UTF8.GetString( resultArray );
    }

当我在Cocoa端运行加密时,我得到加密文本:

UMldOZh8sBnHAbfN6E / 9KfS1VyWAa7RN

但不会在C#端用相同的密钥解密。

感谢任何帮助,谢谢。

6 个答案:

答案 0 :(得分:2)

您可以使用OpenSSL.NET包装器直接在C#中使用OpenSSL!

答案 1 :(得分:1)

需要注意的几件事情:

1-确保正确解释密钥和数据字符串。例如,密钥是用ASCII编码而不是UTF8吗?它可能代表binhex格式吗?

2-您在解密之前没有初始化IV(初始化向量)。它需要匹配你在Cocoa端加密的IV。

答案 2 :(得分:0)

IIRC,OpenSSL使用MS调用PKCS7填充(虽然OpenSSL将其称为PKCS5,但我还不足以解决其中的原因)。

答案 3 :(得分:0)

从Mac到PC来回传输数据的一个经典问题是字节排序。你没有说出Cocoa代码的执行平台是什么,但这是值得注意的,特别是如果它是PowerPC Mac。

答案 4 :(得分:0)

可能与字节序有关,

尝试在解密之前调用Array.Reverse。

var reversedArr = Array.Reverse(toEncrytArray)
byte[] resultArray = cTransform.TransformFinalBlock( reversedArr, 0, reversedArr.Length );

答案 5 :(得分:0)

你也应该发布Cocoa代码,让我们有机会找到你的问题。

但是你发布的内容中隐藏着一些提示:

用密钥和iv解密PyPqLI / d18Q =(base64)给出“97737D09E48B0202”(十六进制)。这看起来像带有PKCS7填充的明文“97737D09E48B”。所以我首先要改变.NET代码以使用PaddingMode.PKCS7并仔细查看将明文传递给Cocoa代码的位置。