java - 将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));
}
解决方案
推荐阅读
- html - 连接 Vue.js 和 laravel
- spring-ws - Spring WebServiceTemplate URL
- javascript - 将 IF/Else 条件转换为 Ramda Cond 失败
- python - 为什么我收到 IndexError: list index out of range 消息?
- bash - 在 bash 脚本中运行多个命令
- ios - Xcode 的 SceneKit 编辑器渲染 .dae 文件错误,Xcode 有时在预览期间崩溃
- autodesk-forge - 单击“完成”按钮后如何进行测量?
- php - 使用 googlepagespeed api 的屏幕截图
- python - 根据没有公共列的坐标合并数据框
- php - 使用按钮问题从表中删除 1 行