【发布时间】:2016-08-10 21:01:17
【问题描述】:
我正在尝试在不同系统之间进行跨组件加密。目前,我无法真正匹配输出。 我为 C 使用 openssl/aes/h 库,为 Java/Scala 使用 javax.crypto。 我在更改 C 系统中的代码方面没有太大的灵活性,所以我需要修改 Java/Scala 代码。
#include <string.h>
#include <openssl/aes.h>
char key[] = "aaaaaaaaaaaaaaaa";
int main(){
unsigned char text[]="hello";
unsigned char enc_out[80];
unsigned char dec_out[80];
AES_KEY enc_key, dec_key;
AES_set_encrypt_key(key, 128, &enc_key);
AES_encrypt(text, enc_out, &enc_key);
return 0
}
C 代码大致如下所示。使用 AES_set_encrypt_key 和 AES_encrypt 调用,除了在需要时用 0 填充(当密钥不是 128 位时)。对于这个简单的示例,填充应该无关紧要。
在我的 scala 代码中:
def aes_encrypt(value: String, k: String): Array[Byte] = {
val cipher = Cipher.getInstance("AES")
val key = Arrays.copyOf(k.getBytes("UTF-8"), 16)
val secretKey: SecretKeySpec = new SecretKeySpec(key, 0, key.length, "AES")
cipher.init(Cipher.ENCRYPT_MODE, secretKey)
cipher.doFinal(value.getBytes("UTF-8"), 0, value.getBytes("UTF-8").length)
}
使用密钥 "aaaaaaaaaaaaaaaa" 和消息 "hello" ,在 base64 中
C 代码给出“XaiMOCo7KteRUkejpd8JLA=="
在 Scala/Java 中"7GHRfFgKVdaAiwti36tqDQ=="
我正在尝试匹配输出,但我无法做到。 我为 Scala 代码尝试了不同的算法,但我不确定如何匹配 C 输出。
我试图查看 AES_set_encrypt_key 和 AES_encrypt 调用的文档,但我无法从中挖掘太多。我知道 openssl 库中有更好的用户友好调用,例如 evp_encryption 调用,但我无法摆脱 AES_set_encrypt_key 和 AES_encrypt
【问题讨论】:
-
您确实应该使用
EVP_*函数,因为它们默认包含填充。而 aes.h 中的函数相当基本,可能根本不应该使用。 -
你应该不使用
AES_encrypt和朋友。这是一个纯软件实现,因此您不会享受硬件支持,如 AES-NI。您应该使用EVP_*函数。请参阅 OpenSSL wiki 上的 EVP Symmetric Encryption and Decryption。事实上,您可能应该使用经过身份验证的加密,因为它提供 机密性和真实性。请参阅 OpenSSL wiki 上的 EVP Authenticated Encryption and Decryption。
标签: java c encryption openssl aes