日期:2014-05-20  浏览次数:20932 次

.net 3des 加密兼容java
对方给的加密方法:java

/**
 * 3DES加密
 * 
 * @param src
 * @param key
 * @return
 * @throws Exception
 */
public static String desedeEncoder(String src, String key) throws Exception {
SecretKey secretKey = new SecretKeySpec(build3DesKey(key), "DESede");
Cipher cipher = Cipher.getInstance("DESede");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] b = cipher.doFinal(src.getBytes("UTF-8"));

return byte2HexStr(b);
}

build3DesKey方法是构建24位密钥,byte2HexStr是用来返回大写的16进制的字符串。
/**
 * 构造3DES加解密方法key
 * 
 * @param keyStr
 * @return
 * @throws Exception
 */
private static byte[] build3DesKey(String keyStr) throws Exception {
byte[] key = new byte[24];
byte[] temp = keyStr.getBytes("UTF-8");
if (key.length > temp.length) {
System.arraycopy(temp, 0, key, 0, temp.length);
} else {
System.arraycopy(temp, 0, key, 0, key.length);
}

return key;
}
/**
 * 字节数组转化为大写16进制字符串
 * 
 * @param b
 * @return
 */
private static String byte2HexStr(byte[] b) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < b.length; i++) {
String s = Integer.toHexString(b[i] & 0xFF);
if (s.length() == 1) {
sb.append("0");
}

sb.append(s.toUpperCase());
}

return sb.toString();
}


对于java我不是很熟悉,
第一个问题就是:这里java的模式是ECB,填充方式为PKCS5Padding吗?
第二个问题:若java是ECB的,那么c#中也应该是ECB模式,填充方式应该是什么?(C#的模式有:ANSIX923、ISO10126、None、PKCS7、Zero,而Java有:NoPadding、PKCS5Padding、SSL3Padding)

我在c#里用的加密方法是(ECB,Zero填充方式):
public string Encrypt3DES(string a_strString, string a_strKey)
    {
        TripleDESCryptoServiceProvider DES = new TripleDESCryptoServiceProvider();

       
        DES.Key = build3DesKey("a_strKey");
        DES.Mode = CipherMode.ECB;
        DES.Padding = System.Security.Cryptography.PaddingMode.Zeros;
        ICryptoTransform DESEncrypt = DES.CreateEncryptor();

        byte[] Buffer = System.Text.Encoding.UTF8.GetBytes(a_strString);
        
        return Convert.ToBase64String(DESEncrypt.TransformFinalBlock(Buffer, 0, Buffer.Length));
    }

构建KEy方法;
private  byte[] build3DesKey(string keyStr)  {
byte[] key = new byte[24];
byte[] temp =  System.Text.Encoding.UTF8.GetBytes(keyStr);
       
if (key.Length > temp.Length) {
            for (int i = 0; i < temp.Length;i++ )