读书人

.net 3des 加密兼容java解决思路

发布时间: 2012-12-23 11:28:15 作者: rapoo

.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++ )


{
key[i] = temp[i];
}

} else {
for (int i = 0; i < key.Length; i++)
{
key[i] = temp[i];
}
}
Response.Write(key.Length);
return key;
}

字节转换:
private static String byte2HexStr(byte[] b) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < b.Length; i++) {
string s = Convert.ToString(b[i], 16);
if (s.Length == 1) {
sb.Append("0");
}

sb.Append(s.ToUpper());
}

return sb.ToString();
}

第三个请教的问题:没有java测试环境,我也不知道上面两个方法是否正确?错误请指出,谢谢!

第四个问题:程序运行结果是:指定密钥是“TripleDES”的已知弱密钥,不能使用。

求救,急需,跪求,谢谢!
[解决办法]
第二个问题:若java是ECB的,那么c#中也应该是ECB模式,填充方式应该是什么?(C#的模式有:ANSIX923、ISO10126、None、PKCS7、Zero,而Java有:NoPadding、PKCS5Padding、SSL3Padding)
这个问题上网找到了,是PKCS7。
[解决办法]
没人回复,我自己搭建了java环境,自己处理了。

读书人网 >.NET

热点推荐