У меня есть соль, iv и пароль, который индивидуально хешируется с использованием md5
.
например: let md5Text = md5("password")
. То же самое для соли и IV.
Тогда ключ будет сгенерирован с использованием соли и пароля md5. Этот сгенерированный ключ создается с использованием алгоритма HMACSHA1
, обеспечивая 1024 итерации (раундов) и длину ключа 256.
Сгенерированный ключ и md5
iv затем используются для шифрования простого текста.
Я могу сгенерировать ключ и зашифровать и расшифровать в моем конце (iOS). Но когда мне удастся расшифровать зашифрованный текст из Java, я не получу ожидаемого результата.
Может ли кто-нибудь помочь мне преобразовать логику завершения JAVA для ее реализации в iOS swift 4.3 для шифрования aes 256?
Пожалуйста, найдите образец кода Java ниже:
public class MD5
{
public static String getHash1(String s) {
try {
// Create MD5 Hash
MessageDigest digest = java.security.MessageDigest.getInstance("MD5");
digest.update(s.getBytes());
byte messageDigest[] = digest.digest();
// Create Hex String
StringBuffer hexString = new StringBuffer();
for (int i=0; i<messageDigest.length; i++) {
String hex = Integer.toHexString(0xFF & messageDigest[i]);
while (hex.length() < 2) {
hex = "0" + hex;
}
hexString.append(hex);
}
return hexString.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return "";
}
public static String encryptedToAes(String password, String salt, int iterations, int keyLength) throws NoSuchAlgorithmException, InvalidKeySpecException {
char[] chars = password.toCharArray();
PBEKeySpec spec = new PBEKeySpec(chars, salt.getBytes(), 1024, 256);
SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
SecreteKey tmp = skf.generateSecrete(spec)
SecreteKey secrete = new SecreteKeySpec(tmp.getEncoded(), "AES");
byte[] iv_bytes = toBin(iv);
IvParameterSpec ivspec = new IvParameterSpec(iv_bytes);
Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secret, ivspec);
byte[] encryptedText = cipher.doFinal(plainText.getBytes())
return toHex(encryptedText);
}
// Converts byte array to a hexadecimal string
private static byte[] toHex(String str) {
int length = str.length() / 2;
byte[] buffer = new byte[length];
for (int i = 0; i < array.length; i++) {
buffer[i] = (byte) Integer.parseInt(str.subString(i*2, i*2+2), 16);
}
return buffer;
}
private static String toBin(byte[] array) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < array.length; i++) {
sb.append(Integer.toString((array[i] & 0xff) + 0x100, 16).substring(1));
}
return sb.toString();
}
private string pass = getHash1("Password")
private string salt = getHash1("Salt")
private string iv = getHash1("IV")
encryptedToAes(pass, salt, 1024, 256)
PlainText = "TEST"