代码之家  ›  专栏  ›  技术社区  ›  Ashish Shukla

返回不同长度密码的三重Des码

  •  0
  • Ashish Shukla  · 技术社区  · 6 年前

    我从服务器人员那里得到了以下代码:

    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的加密文本是

    但第二个代码返回:

    • 121212的加密文本是 2STVJSd1mnw=

    • 当我把明文增加到10位数时,我得到的是24位数的密文

    有人能帮我吗

    提前谢谢

    1 回复  |  直到 6 年前
        1
  •  3
  •   Maarten Bodewes    6 年前

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

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

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