Я ищу эквивалентный код C для кода Java ниже. Я пытаюсь написать два приложения, одно на java, а другое - на C. Java-приложение шифрует / дешифрует строку с помощью ниже логики, и оно работает при использовании ниже java-метода.
public class AEScrypt {
public static String encryptString(String strToEncrypt, String secret, String salt, byte[] iv) {
try {
IvParameterSpec ivspec = new IvParameterSpec(iv);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
KeySpec keySpec = new PBEKeySpec(secret.toCharArray(), salt.getBytes(), 65536, 256);
SecretKey secretKeySpec = keyFactory.generateSecret(keySpec);
SecretKeySpec secretKey = new SecretKeySpec(secretKeySpec.getEncoded(), "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivspec);
int length = 0;
if (strToEncrypt.length() <= 16) {
length = 16;
} else if (strToEncrypt.length() > 16 && strToEncrypt.length() <= 32) {
length = 16;
}
strToEncrypt = fixedLengthString(strToEncrypt, length);
return Base64.getEncoder().encodeToString(cipher.doFinal(strToEncrypt.getBytes(StandardCharsets.UTF_8)));
} catch (Exception exception) {
System.out.println("Error while encrypting value : "+exception.getMessage());
}
return null;
}
private static String fixedLengthString(String string, int length) {
return String.format("%" + length + "s", string);
}
public static String decryptString(String strToDecrypt, String secret, String salt, byte[] iv) {
try {
IvParameterSpec ivspec = new IvParameterSpec(iv);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
KeySpec keySpec = new PBEKeySpec(secret.toCharArray(), salt.getBytes(), 65536, 256);
SecretKey secretKeySpec = keyFactory.generateSecret(keySpec);
SecretKeySpec secretKey = new SecretKeySpec(secretKeySpec.getEncoded(), "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
cipher.init(Cipher.DECRYPT_MODE, secretKey, ivspec);
return new String(cipher.doFinal(Base64.getDecoder().decode(strToDecrypt))).trim();
} catch (Exception e) {
e.getMessage();
}
return null;
}
}
Что я понимаю из приведенного выше кода JAVA:
ДЛЯ ШИФРОВАНИЯ:
- Мы используем HMAC-sha256 для генерации ключа, который принимает соль, пароль.
- Заполнение входных данных.
- Мы используем AES-CBC-256 для шифрования вводимых данных, используя сгенерированный выше ключ и iv.
- Мы кодируем данные шифрования с помощью base64.
ДЛЯ РАСШИФРОВКИ:
- Мы используем HMAC-sha256 для генерации ключа, который принимает соль, пароль.
- Мы декодируем с помощью base64 и получаем зашифрованные данные.
- Мы используем AES-CBC-256 для дешифрования зашифрованных данных, используя сгенерированный выше ключ и iv.
- Обрежьте расшифрованные данные.
Для репликации того же самого в C я использовал метод шифрования / дешифрования из ссылки ниже; Симметричное шифрование и дешифрование EVP
Для генерации ключа я использовал PKCS5_PBKDF2_HMAC и EVP_MD как EVP_sha256 ().
int PKCS5_PBKDF2_HMAC(const char *pass, int passlen,
const unsigned char *salt, int saltlen, int iter,
const EVP_MD *digest,
int keylen, unsigned char *out);
Для кодирования / декодирования base64: кодирование / декодирование base64
Также я позаботился о логике заполнения и обрезки. Но я получаю разные зашифрованные данные из кода Java и C. Я что-то здесь упускаю?
Если у вас есть пример функции на C, это будет очень полезно.