Я пытаюсь взять работающий Python код и преобразовать его в java. Я пытаюсь реплицировать функцию python, вероятно, буквально на стороне java, и не смог заставить ее работать.
Пример данных для ввода и вывода
«зашифровано»: «V1: tOhwo8540kw =: a + UDgFETMZyyBL3KEYG7Vw ==: 8ZyjHdUPJ + en4s25gHTqig ==«
«расшифровано»: «можно передать это как netapp123
* 1009» допустимые работы "
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));
}