異なるシステム間でのクロスコンポーネント暗号化を試みています。現在、私は実際に出力を一致させることはできません。 私はC言語用のopenssl/aes/hライブラリと、Java/Scala用のjavax.cryptoを使用しています。 私はCシステムのコードを変更することに柔軟性がないので、Java/Scalaコードを変更する必要があります。AES暗号化クロスコンポーネントJava/ScalaとC
#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コードは、おおよそ必要なときに(鍵が128ビットでない場合)、0でパディングがある以外はAES_set_encrypt_keyとAES_ENCRYPTコールthat.Usingように見えます。この単純な例では、パディングは重要です。 BASE64
にCコードがで "XaiMOCo7KteRUkejpd8JLA =="
を与えるキーを使用して
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" およびメッセージ "ハロー"、:私はScalaのコードで
Scala/Java "7GHRfFgKVdaAiwti36tqDQ =="
私は出力を一致させようとしていますが、できませんでした。 私はScalaコードに対して別のアルゴリズムを試しましたが、どのようにC出力にマッチさせるべきかわかりません。
私はAES_set_encrypt_keyとAES_encrypt呼び出しのドキュメントを調べようとしましたが、あまりにも多くを掘り下げることはできませんでした。私はevp_encryptionコールなどのOpenSSLライブラリからより優れたユーザーフレンドリーなコールがあることを知っているが、私はAES_set_encrypt_keyとAES_ENCRYPT
実際には 'EVP_ *'関数を使うべきです。なぜなら、デフォルトではパディングが含まれているからです。 aes.hの関数はむしろ基本的なものであり、まったく使用されていないはずです。 –
あなたは 'AES_encrypt'とフレンドを使うべきではありません。これはソフトウェアのみの実装なので、AES-NIなどのハードウェアサポートは受けられません。あなたは 'EVP_ *'関数を使用していなければなりません。 OpenSSL wikiの[EVP Symmetric Encryption and Decryption](http://wiki.openssl.org/index.php/EVP_Symmetric_Encryption_and_Decryption)を参照してください。実際には、機密性と信頼性の両方を提供するため、おそらく認証された暗号化を使用するべきです。 OpenSSL wikiの[EVP Authenticated Encryption and Decryption](http://wiki.openssl.org/index.php/EVP_Authenticated_Encryption_and_Decryption)を参照してください。 – jww