加解密实例:
加密前的字符串=this is a test !
加密前的16进制byte数据=74686973206973206120746573742021
密钥=31A23DC530D233323E3F32C531303639
加密后数据=68446A3371CE3C69F33FB963EEEB25BFBCC3FECAC6F0AE01
解密后16进制byte数据=74686973206973206120746573742021
解密后字符串=this is a test !
这是合作方提供给我们的加密资料。。试了好多次加密出来的就是不一样。。加密模式是ECB,求教。。。。
应该是编码的问题,根据我的经验,你应该把 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);
编码方式是UTF-8
我试过了还是不行
@猪头猪脑: 对不起,我用上面的方式验证过,BytesToHexString(encryptedData) 的结果的确是 "68446A3371CE3C69F33FB963EEEB25BFBCC3FECAC6F0AE01"
@Launcher: 我试下
@Launcher: 能把你代码贴出来吗。
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.
@猪头猪脑: 把EncyptByTripleDES 和HexStringToBytes方法贴下行吗,谢谢了
@Launcher: 谢谢啊。。。
@猪头猪脑:
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: 谢谢啊。
@猪头猪脑: 又要麻烦您。我解密的时候解密出来的数据是这个:this is a test !�������� 后面有乱码
@猪头猪脑: 因为你没有得到正确的字节数组长度.
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: 真是太感谢您了。
难道你们的合作方不是在windows下加密的?
是啊。他们是用java写的 编码方式是UTF-8
你用的什么操作系统啊,不行换MD5看看