首页 > 解决方案 > 将python解密函数转换为等效的java

问题描述

我正在尝试采用功能正常的 Python 代码并将其转换为 java。我正在尝试在 java 端复制 python 函数,但无法让它工作。

输入和输出的示例数据

“加密”:“V1:tOhwo8540kw=:a+UDgFETMZyyBL3KEYG7Vw==:8ZyjHdUPJ+en4s25gHTqig==

“解密”:“netapp123

passphrase = "这怎么可能是可接受的作品"

Python代码如下:

import argparse
import base64
import hashlib
import os
import re
import sys

try:
    from Crypto.Cipher import DES
except:
    sys.stderr.write("Error: pycrypto not found - please install before using this script, with e.g. sudo easy_install pycrypto\n")
    sys.exit(1)

def get_derived_key(passphrase, salt, count):
    key = "".join((passphrase[0], salt))
    for i in range(count):
        m = hashlib.md5(key)
        print(key)
        key = m.digest()
    return (key[:8], key[8:])

def decrypt(text, passphrase):
    text_bytes = base64.b64decode(text)
    salt = text_bytes[:8]
    enc_text = text_bytes[8:]

    (dk, iv) = get_derived_key(passphrase, salt, 1000)
    crypter = DES.new(dk, DES.MODE_CBC, iv)
    text = crypter.decrypt(enc_text)

    return re.sub(r'[\x01-\x08]','', text)

def encrypt(text, passphrase):
    salt = os.urandom(8)
    pad_num = 8 - (len(text) % 8)
    for i in range(pad_num):
        text += chr(pad_num)
    (dk, iv) = get_derived_key(passphrase, salt, 1000)
    crypter = DES.new(dk, DES.MODE_CBC, iv)
    enc_text = crypter.encrypt(text)

    return base64.b64encode("".join((salt, enc_text)))

我在java方面想出的是这个,但它不起作用

public static String decrypt(String encryptString, String passphrase) throws NoSuchPaddingException, NoSuchAlgorithmException, BadPaddingException, IllegalBlockSizeException {
    byte[] text_bytes = Base64.decodeBase64(encryptString);
    byte[] salt = Arrays.copyOfRange(text_bytes, 0, 8);
    byte[] enc_text = Arrays.copyOfRange(text_bytes, 8, text_bytes.length);

    List<String> derivedKeyList = null;
    try {
        derivedKeyList = getDerivedKey(passphrase, salt, 1000);
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }

    try {
        //IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));
        SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");

        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
        cipher.init(Cipher.DECRYPT_MODE, skeySpec, derivedKeyList[1]);
        byte[] original = cipher.doFinal(Base64.decodeBase64(enc_text));

        return new String(original);
    } catch (Exception ex) {
        ex.printStackTrace();
    }

}

public static List<String> getDerivedKey(String passphrase, byte[] salt, int count) throws NoSuchAlgorithmException {
    String key = String.join(passphrase.substring(0,0), Arrays.toString(salt));
    for (int i = 0; i < count; i++) {
        MessageDigest md = MessageDigest.getInstance("MD5");
        md.update(key.getBytes());
        key = Arrays.toString(md.digest());
    }
    
    return List.of(key.substring(0, 8), key.substring(8));
}

标签: javapythonencryption

解决方案


推荐阅读