我正在寻找以下 java 代码的等效 C 代码。我正在尝试编写两个应用程序,一个在 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 来生成“key”,它需要“salt”、“password”。
- 填充输入数据。
- 我们使用 AES-CBC-256 加密填充的输入数据,使用上面生成的“key”和“iv”。
- 我们使用 base64 对加密数据进行编码。
解密:
- 我们使用 HMAC-sha256 来生成“key”,它需要“salt”、“password”。
- 我们使用 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 中有任何示例函数,那将非常有帮助。