首页新闻找找看学习计划

c# 3DES加密???急急急。。。。。。

0
悬赏园豆:5 [已解决问题] 解决于 2012-12-14 13:40

加解密实例:

加密前的字符串=this is a test !

加密前的16进制byte数据=74686973206973206120746573742021

密钥=31A23DC530D233323E3F32C531303639

加密后数据=68446A3371CE3C69F33FB963EEEB25BFBCC3FECAC6F0AE01

解密后16进制byte数据=74686973206973206120746573742021

解密后字符串=this is a test !

 

这是合作方提供给我们的加密资料。。试了好多次加密出来的就是不一样。。加密模式是ECB,求教。。。。

猪头猪脑的主页 猪头猪脑 | 初学一级 | 园豆:6
提问于:2012-12-07 13:56
< >
分享
最佳答案
1

应该是编码的问题,根据我的经验,你应该把 this is a test ! 用 Gb2312(国内厂商都喜欢它) 编码,例如:

假设加密函数:

public static byte[] EncryptByTripleDES(byte[] encryptBytes, byte[] tDESKey, byte[] tDESIV);

调用:

byte[] encryptedData = EncryptByTripleDES(Encoding.GetEncoding("GB2312").GetBytes("this is a test !"),HexStringToBytes("31A23DC530D233323E3F32C531303639"),null);

 

收获园豆:5
Launcher | 高人七级 |园豆:45030 | 2012-12-07 15:24

编码方式是UTF-8

猪头猪脑 | 园豆:6 (初学一级) | 2012-12-07 15:59

我试过了还是不行

猪头猪脑 | 园豆:6 (初学一级) | 2012-12-07 15:59

@猪头猪脑: 对不起,我用上面的方式验证过,BytesToHexString(encryptedData) 的结果的确是 "68446A3371CE3C69F33FB963EEEB25BFBCC3FECAC6F0AE01"

Launcher | 园豆:45030 (高人七级) | 2012-12-07 16:03

@Launcher: 我试下

猪头猪脑 | 园豆:6 (初学一级) | 2012-12-07 16:05

@Launcher: 能把你代码贴出来吗。

猪头猪脑 | 园豆:6 (初学一级) | 2012-12-07 16:07
public static byte[] EncryptByTripleDES(byte[] encryptBytes, byte[] tDESKey, byte[] tDESIV)
        {
            try
            {
                TripleDESCryptoServiceProvider tDESalg = new TripleDESCryptoServiceProvider();

                tDESalg.Key = tDESKey;

                if(tDESIV == null)
                    tDESalg.Mode = CipherMode.ECB;
                else
                    tDESalg.IV = tDESIV;

                MemoryStream ms = new MemoryStream();

                CryptoStream encStream = new CryptoStream(ms, tDESalg.CreateEncryptor(), CryptoStreamMode.Write);

                encStream.Write(encryptBytes, 0, encryptBytes.Length);
                encStream.FlushFinalBlock(); //内存流需要调用此操作            

                ms.Seek(0, SeekOrigin.Begin);

                byte[] decryptBytes = ms.ToArray();

                encStream.Close();
                ms.Close();

                return decryptBytes;
            }
            catch (Exception e)
            {
                throw new ApplicationException("使用 Triple DES 加密失败,详细错误信息请查看内部异常。", e);
            }
        }

 

@猪头猪脑: 当然,如果对方确定使用UTF-8,你也应该使用UTF-8.

Launcher | 园豆:45030 (高人七级) | 2012-12-07 16:10

@猪头猪脑: 把EncyptByTripleDES 和HexStringToBytes方法贴下行吗,谢谢了

猪头猪脑 | 园豆:6 (初学一级) | 2012-12-07 16:14

@Launcher: 谢谢啊。。。

猪头猪脑 | 园豆:6 (初学一级) | 2012-12-07 16:18

@猪头猪脑: 

public static string BytesToHexString(byte[] bytes)
        {
            try
            {
                StringBuilder sBuilder = new StringBuilder();

                for (int i = 0; i < bytes.Length; i++)
                {
                    sBuilder.Append(bytes[i].ToString("X2"));
                }

                return sBuilder.ToString();
            }
            catch (Exception e)
            {
                throw new ApplicationException("将指定无符号字节数组编码成十六进制字符串时失败,详细错误信息请查看内部异常。", e);
            }
        }

        public static byte[] HexStringToBytes(string hexString)
        {
            try
            {
                byte[] bytes = new byte[hexString.Length / 2];

                for (int i = 0; i < bytes.Length; i++)
                {
                    try
                    {
                        // 每两个字符是一个 byte。 
                        bytes[i] = byte.Parse(hexString.Substring(i * 2, 2),
                        System.Globalization.NumberStyles.HexNumber);
                    }
                    catch
                    {
                        throw new ArgumentException("hex is not a valid hex number!", "hex");
                    }
                }

                return bytes;
            }
            catch (Exception e)
            {
                throw new ApplicationException("将指定十六进制字符串解码成无符号字节数组时失败,详细错误信息请查看内部异常。", e);
            }
        }
Launcher | 园豆:45030 (高人七级) | 2012-12-07 16:20

@Launcher: 谢谢啊。

猪头猪脑 | 园豆:6 (初学一级) | 2012-12-07 16:23

@猪头猪脑: 又要麻烦您。我解密的时候解密出来的数据是这个:this is a test !�������� 后面有乱码

猪头猪脑 | 园豆:6 (初学一级) | 2012-12-07 17:03

@猪头猪脑: 因为你没有得到正确的字节数组长度.

public static byte[] DecryptByTripleDES(byte[] decryptBytes, byte[] tDESKey, byte[] tDESIV)
        {
            try
            {
                TripleDESCryptoServiceProvider tDESalg = new TripleDESCryptoServiceProvider();

                tDESalg.Key = tDESKey;

                if (tDESIV == null)
                    tDESalg.Mode = CipherMode.ECB;
                else
                    tDESalg.IV = tDESIV;

                MemoryStream ms = new MemoryStream();

                CryptoStream encStream = new CryptoStream(ms, tDESalg.CreateDecryptor(), CryptoStreamMode.Write);

                encStream.Write(decryptBytes, 0, decryptBytes.Length);
                encStream.FlushFinalBlock(); //内存流需要调用此操作            

                ms.Seek(0, SeekOrigin.Begin);

                byte[] encryptBytes = ms.ToArray();

                encStream.Close();
                ms.Close();

                return encryptBytes;
            }
            catch (Exception e)
            {
                throw new ApplicationException("使用 Triple DES 解密失败,详细错误信息请查看内部异常。", e);
            }
        }
Launcher | 园豆:45030 (高人七级) | 2012-12-07 17:07

@Launcher: 真是太感谢您了。

猪头猪脑 | 园豆:6 (初学一级) | 2012-12-07 17:11
其他回答(2)
0

难道你们的合作方不是在windows下加密的?

chenping2008 | 园豆:9836 (大侠五级) | 2012-12-07 14:34

是啊。他们是用java写的 编码方式是UTF-8

支持(0) 反对(0) 猪头猪脑 | 园豆:6 (初学一级) | 2012-12-07 15:59
0

你用的什么操作系统啊,不行换MD5看看

男人要爽 | 园豆:10 (初学一级) | 2014-01-12 13:26
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册