前提・実現したいこと
プログラミング初心者です。よろしくお願いします。
Rubyで暗号化して、Javaで復号するプログラムを作りたいのですが上手くいきません…
Javaで復号しようとすると、以下のエラーメッセージが出てしまい、困っています。
発生している問題・エラーメッセージ
Exception in thread "main" javax.crypto.AEADBadTagException: Tag mismatch! at com.sun.crypto.provider.GaloisCounterMode.decryptFinal(GaloisCounterMode.java:620) at com.sun.crypto.provider.CipherCore.finalNoPadding(CipherCore.java:1116) at com.sun.crypto.provider.CipherCore.fillOutputBuffer(CipherCore.java:1053) at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:853) at com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:446) at javax.crypto.Cipher.doFinal(Cipher.java:2168) at decrypted2.main(decrypted2.java:25)
該当のソースコード
Ruby
1# 暗号化するRubyファイル 2 3require 'openssl' 4require 'base64' 5 6cipher = OpenSSL::Cipher.new('aes-256-gcm') 7cipher.encrypt 8iv = cipher.random_iv 9key = cipher.random_key 10auth_tag = 'authtag' 11cipher.auth_data = auth_tag 12plainText = 'my secret data' 13 14cipherText = cipher.update(plainText) + cipher.final 15 16# Javaに連携するデータを取得 17p Base64.strict_encode64(cipherText) # -> "NzCmNt2+BO9xBOkdD6g=" 18p Base64.strict_encode64(iv) # -> "1xF2aTB8KP9JW4Dl" 19p Base64.strict_encode64(cipher.auth_tag) # -> "m0m6f6XX6p+JxsfRtoa4DQ==" 20p Base64.strict_encode64(key) # -> "3O3oUShs7SYm92SJGBHY4iwUDppMQctXDWMMzmMYBnU="
Java
1// 復号するJavaファイル 2import java.util.Base64; 3import javax.crypto.*; 4import javax.crypto.spec.*; 5import java.util.Arrays; 6 7public class decrypted2 { 8 9 public static void main(String[] args) throws Exception { 10 byte[] cipherText = Base64.getDecoder().decode("NzCmNt2+BO9xBOkdD6g="); // encrypted data 11 byte[] myIv = Base64.getDecoder().decode("1xF2aTB8KP9JW4Dl"); // iv 12 byte[] auth_tag = Base64.getDecoder().decode("m0m6f6XX6p+JxsfRtoa4DQ=="); // auth_tag 13 int myTLen = 128; // auth_tagビット長(16バイト) 14 byte[] secretKey = Base64.getDecoder().decode("3O3oUShs7SYm92SJGBHY4iwUDppMQctXDWMMzmMYBnU"); // secretKey 15 SecretKeySpec myKey = new SecretKeySpec(secretKey, "AES"); 16 17 // 暗号化後文字列とauth_tagを連結する 18 byte[] ciTxt_tag = new byte[cipherText.length + auth_tag.length]; 19 System.arraycopy(auth_tag, 0, ciTxt_tag, 0, auth_tag.length); 20 System.arraycopy(cipherText, 0, ciTxt_tag, auth_tag.length, cipherText.length); 21 22 GCMParameterSpec myParams = new GCMParameterSpec(myTLen, myIv); 23 Cipher c = Cipher.getInstance("AES/GCM/NoPadding"); 24 c.init(Cipher.DECRYPT_MODE, myKey, myParams); 25 26 byte[] recoveredText = c.doFinal(ciTxt_tag); 27 28 System.out.println("復号後の文字列: " + recoveredText); 29 } 30}
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
ruby 2.5.0p0
java version "1.8.0_311"
回答1件
あなたの回答
tips
プレビュー