java - Triple Des 代码返回不同长度的密码

标签 java c# android encryption tripledes

我从服务器人员那里得到了这段代码:

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==

但是第二个代码返回这个:

  • 121212 的加密文本为 2STVJSd1mnw=

观察结果:

  • 当我将明文增加到 10 位数字时,我得到 24 位密文

任何人都可以帮助我吗:

提前致谢

最佳答案

你被名字不好的 Unicode 愚弄了类,它实际上指定 UTF-16LE 而不是 UTF-8。

您可以使用StandardCharsets.UTF_16LE用于指定编码而不是字符串;这可以让您免于处理一个异常。

如果长度仍然存在问题(测试!),那么您可能必须处理字节顺序标记或 BOM - 但我不这么认为。

关于java - Triple Des 代码返回不同长度的密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54587846/

相关文章:

java - 只要我的数组列表中有超过 1 个匹配元素,如何从 Excel 文件填充 JTable? [Java]

java - 寻找 Java EE 视频教程

android - 将录音编码和解码为 G711 ( PCMU - uLaw) 格式

php - 使用json从PHP-MySql服务器获取图像到Android

java - Android 上解密数据库的临时存储

java - Spring boot,JVM参数太多还是刚好够用?

C#MVC : How to override configured authentication redirect?

c# - SqlConnection 类中的默认网络协议(protocol)是什么

c# - Xamarin.forms webview 和在 HTML5 视频标签和 android 问题中查看/播放视频

java - Java 编译器通常会预先计算最终字段的哈希码吗?