三重 Des 代码返回不同长度的密码
Triple Des codes returning cipher with different lengths
我从服务器人员那里得到了这段代码:
public string Encryption(string PlainText)
{
string key = "twelve_digit_key";
TripleDES des = CreateDES(key);
ICryptoTransform ct = des.CreateEncryptor();
byte[] input = Encoding.Unicode.GetBytes(PlainText);
byte[] buffer = ct.TransformFinalBlock(input, 0, input.Length);
return Convert.ToBase64String(buffer);
}
static TripleDES CreateDES(string key)
{
MD5 md5 = new MD5CryptoServiceProvider();
TripleDES des = new TripleDESCryptoServiceProvider();
des.Key = md5.ComputeHash(Encoding.Unicode.GetBytes(key));
des.IV = new byte[des.BlockSize / 8];
return des;
}
这是我上面的代码:
public String encryptDES(String message) throws Exception {
final MessageDigest md = MessageDigest.getInstance("md5");
final byte[] digestOfPassword = md.digest(getNativeKey3().getBytes("utf-8"));
final byte[] keyBytes = Arrays.copyOf(digestOfPassword, 24);
for (int j = 0, k = 16; j < 8; ) {
keyBytes[k++] = keyBytes[j++];
}
final SecretKey key = new SecretKeySpec(digestOfPassword, "DESede");
final IvParameterSpec iv = new IvParameterSpec(new byte[8]);
final Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS7Padding");
cipher.init(Cipher.ENCRYPT_MODE, key, iv);
final byte[] plainTextBytes = message.getBytes("utf-8");
final byte[] cipherText = cipher.doFinal(plainTextBytes);
return Base64.encodeToString(cipherText, Base64.DEFAULT)
.replace("\n", "")
.replace("\r", "");
}
问题:
第一个代码给出以下结果:
- 121212 的加密文本是 VvRQkSUj5SQ69mGXsL+h6w==
但是第二个代码 returns 这个 :
- 121212 的加密文本是 2STVJSd1mnw=
观察:
- 当我将明文增加到 10 位时,我得到 24 位密文
任何人都可以帮助我吗:
提前致谢
你被名字不好的 Unicode
class 给骗了,它实际上指定的是 UTF-16LE 而不是 UTF-8。
您可以使用StandardCharsets.UTF_16LE
来指定编码而不是字符串;这使您免于处理一个异常。
如果长度仍然存在问题(测试!),那么您可能需要处理字节顺序标记或 BOM - 但我不这么认为。
我从服务器人员那里得到了这段代码:
public string Encryption(string PlainText)
{
string key = "twelve_digit_key";
TripleDES des = CreateDES(key);
ICryptoTransform ct = des.CreateEncryptor();
byte[] input = Encoding.Unicode.GetBytes(PlainText);
byte[] buffer = ct.TransformFinalBlock(input, 0, input.Length);
return Convert.ToBase64String(buffer);
}
static TripleDES CreateDES(string key)
{
MD5 md5 = new MD5CryptoServiceProvider();
TripleDES des = new TripleDESCryptoServiceProvider();
des.Key = md5.ComputeHash(Encoding.Unicode.GetBytes(key));
des.IV = new byte[des.BlockSize / 8];
return des;
}
这是我上面的代码:
public String encryptDES(String message) throws Exception {
final MessageDigest md = MessageDigest.getInstance("md5");
final byte[] digestOfPassword = md.digest(getNativeKey3().getBytes("utf-8"));
final byte[] keyBytes = Arrays.copyOf(digestOfPassword, 24);
for (int j = 0, k = 16; j < 8; ) {
keyBytes[k++] = keyBytes[j++];
}
final SecretKey key = new SecretKeySpec(digestOfPassword, "DESede");
final IvParameterSpec iv = new IvParameterSpec(new byte[8]);
final Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS7Padding");
cipher.init(Cipher.ENCRYPT_MODE, key, iv);
final byte[] plainTextBytes = message.getBytes("utf-8");
final byte[] cipherText = cipher.doFinal(plainTextBytes);
return Base64.encodeToString(cipherText, Base64.DEFAULT)
.replace("\n", "")
.replace("\r", "");
}
问题:
第一个代码给出以下结果:
- 121212 的加密文本是 VvRQkSUj5SQ69mGXsL+h6w==
但是第二个代码 returns 这个 :
- 121212 的加密文本是 2STVJSd1mnw=
观察:
- 当我将明文增加到 10 位时,我得到 24 位密文
任何人都可以帮助我吗:
提前致谢
你被名字不好的 Unicode
class 给骗了,它实际上指定的是 UTF-16LE 而不是 UTF-8。
您可以使用StandardCharsets.UTF_16LE
来指定编码而不是字符串;这使您免于处理一个异常。
如果长度仍然存在问题(测试!),那么您可能需要处理字节顺序标记或 BOM - 但我不这么认为。