質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

暗号化

ネットワークを通じてデジタルデータをやり取りする際に、第三者に解読されることのないよう、アルゴリズムを用いてデータを変換すること。

Q&A

解決済

2回答

1420閲覧

"checksum mismatch at 0 of 20"というエラーが発生していて原因と解決方法を教えてほしいです。

ikjmyh

総合スコア7

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

暗号化

ネットワークを通じてデジタルデータをやり取りする際に、第三者に解読されることのないよう、アルゴリズムを用いてデータを変換すること。

0グッド

0クリップ

投稿2020/03/26 10:03

前提・実現したいこと

エラーが発生していて"checksum mismatch at 0 of 20"という文言が表示されます。
ここでエラーが発生しているのだろうという場所までは推測できたのですがコードを見てもエラーの原因が特定できません。
エラーの原因と解決方法を教えていただきたいです。

発生している問題・エラーメッセージ

Exception in thread "main" org.bouncycastle.openpgp.PGPException: checksum mismatch at 0 of 20
at org.bouncycastle.openpgp.PGPSecretKey.extractKeyData(Unknown Source)
at org.bouncycastle.openpgp.PGPSecretKey.extractPrivateKey(Unknown Source)
at decrypt.Boucycastle_test2.getPrivateKey(Boucycastle_test2.java:79)
at decrypt.Boucycastle_test2.decryptFile(Boucycastle_test2.java:57)
at decrypt.Boucycastle_test2.main(Boucycastle_test2.java:37)

getPrivateKeyメソッドの
PGPPrivateKey pgpPrivateKey =getSecretKey(secringgpg).extractPrivateKey(secretKeyDecryptor);
の行でエラーが発生しているようです。
以下は実行してエラーが発生したコードです。

java

1package decrypt; 2 3import java.io.File; 4import java.io.FileInputStream; 5import java.io.IOException; 6import java.io.InputStream; 7import java.security.GeneralSecurityException; 8import java.security.Key; 9import java.security.NoSuchProviderException; 10import java.security.PrivateKey; 11import java.security.Security; 12import java.util.Arrays; 13 14import javax.crypto.Cipher; 15 16import org.bouncycastle.jce.provider.BouncyCastleProvider; 17import org.bouncycastle.openpgp.PGPException; 18import org.bouncycastle.openpgp.PGPPrivateKey; 19import org.bouncycastle.openpgp.PGPSecretKey; 20import org.bouncycastle.openpgp.PGPSecretKeyRing; 21import org.bouncycastle.openpgp.PGPUtil; 22import org.bouncycastle.openpgp.operator.KeyFingerPrintCalculator; 23import org.bouncycastle.openpgp.operator.PBESecretKeyDecryptor; 24import org.bouncycastle.openpgp.operator.bc.BcKeyFingerprintCalculator; 25import org.bouncycastle.openpgp.operator.jcajce.JcaPGPKeyConverter; 26import org.bouncycastle.openpgp.operator.jcajce.JcePBESecretKeyDecryptorBuilder; 27 28public class Boucycastle_test2 { 29 public static void main(String[] args) throws Exception { 30 init(); 31 32 File secre = new File("secring.gpg"); 33 File encry = new File("encrypt_data.dat"); 34 File dec_data = new File("dec.dat"); 35 char[] passp="password".toCharArray(); 36 37 decryptFile(encry, dec_data, secre, passp); 38 39 } 40 private static void init() { 41 Security.addProvider(new BouncyCastleProvider()); 42 } 43 44 /** 45 * ファイルを複合する 46 * 47 * @param encryptFile 暗号化ファイル 48 * @param clearTextFile 平文ファイル 49 * @param secringgpg GnuPGの鍵が保存されているsecring.gpg 50 * @param passphrase パスフレーズ 51 * @throws GeneralSecurityException 52 * @throws IOException 53 * @throws PGPException 54**/ 55 public static void decryptFile(File encryptFile, File clearTextFile, File secringgpg, char[] passphrase) 56 throws GeneralSecurityException, IOException, PGPException { 57 byte[] data = decrypt(getPrivateKey(secringgpg, passphrase), encryptFile); 58 59 String str =new String(data); 60 61 System.out.println(str); 62 } 63 64 private static byte[] decrypt(Key key, File encryptFile) throws GeneralSecurityException, IOException { 65 66 FileInputStream fileInputStream = null; 67 byte[]bFile = new byte[(int) encryptFile.length()]; 68 fileInputStream.read(bFile); 69 70 Cipher cipher = Cipher.getInstance("RSA", Security.getProvider(BouncyCastleProvider.PROVIDER_NAME)); 71 cipher.init(Cipher.DECRYPT_MODE, key); 72 cipher.update(bFile); 73 return cipher.doFinal(); 74 } 75 76 private static PrivateKey getPrivateKey(File secringgpg, char[] passphrase) 77 throws NoSuchProviderException, IOException, PGPException { 78 PBESecretKeyDecryptor secretKeyDecryptor = new JcePBESecretKeyDecryptorBuilder().setProvider("BC").build(passphrase); 79 PGPPrivateKey pgpPrivateKey = getSecretKey(secringgpg).extractPrivateKey(secretKeyDecryptor); 80 81 Arrays.fill(passphrase, '0'); 82 83 PrivateKey privateKey = new JcaPGPKeyConverter().getPrivateKey(pgpPrivateKey); 84 return privateKey; 85 } 86 87 private static PGPSecretKey getSecretKey(File secringgpg) throws IOException, PGPException{ 88 InputStream is = null; 89 try { 90 is = PGPUtil.getDecoderStream(new FileInputStream(secringgpg)); 91 KeyFingerPrintCalculator FP_CALC = new BcKeyFingerprintCalculator(); 92 PGPSecretKeyRing keyRing = new PGPSecretKeyRing(is,FP_CALC); 93 94 return keyRing.getSecretKey(); 95 } finally { 96 if (is != null) is.close(); 97 } 98 } 99} 100

以下はchecksum mismatch atの文言がある唯一のメソッドのコードです。

PGPSecretKey.class

1private byte[] extractKeyData(PBESecretKeyDecryptor var1) throws PGPException { 2 byte[] var2 = this.secret.getSecretKeyData(); 3 Object var3 = null; 4 byte[] var12; 5 if (this.secret.getEncAlgorithm() != 0) { 6 try { 7 byte[] var4; 8 int var7; 9 if (this.secret.getPublicKeyPacket().getVersion() == 4) { 10 var4 = var1.makeKeyFromPassPhrase(this.secret.getEncAlgorithm(), this.secret.getS2K()); 11 var12 = var1.recoverKeyData(this.secret.getEncAlgorithm(), var4, this.secret.getIV(), var2, 0, var2.length); 12 boolean var5 = this.secret.getS2KUsage() == 254; 13 byte[] var6 = checksum(var5 ? var1.getChecksumCalculator(2) : null, var12, var5 ? var12.length - 20 : var12.length - 2); 14 15 for(var7 = 0; var7 != var6.length; ++var7) { 16 if (var6[var7] != var12[var12.length - var6.length + var7]) { 17 throw new PGPException("checksum mismatch at " + var7 + " of " + var6.length); 18 } 19 } 20 } else { 21 var4 = var1.makeKeyFromPassPhrase(this.secret.getEncAlgorithm(), this.secret.getS2K()); 22 var12 = new byte[var2.length]; 23 byte[] var13 = new byte[this.secret.getIV().length]; 24 System.arraycopy(this.secret.getIV(), 0, var13, 0, var13.length); 25 int var14 = 0; 26 27 int var8; 28 for(var7 = 0; var7 != 4; ++var7) { 29 var8 = (((var2[var14] & 255) << 8 | var2[var14 + 1] & 255) + 7) / 8; 30 var12[var14] = var2[var14]; 31 var12[var14 + 1] = var2[var14 + 1]; 32 if (var8 > var2.length - (var14 + 2)) { 33 throw new PGPException("out of range encLen found in encData"); 34 } 35 36 byte[] var9 = var1.recoverKeyData(this.secret.getEncAlgorithm(), var4, var13, var2, var14 + 2, var8); 37 System.arraycopy(var9, 0, var12, var14 + 2, var9.length); 38 var14 += 2 + var8; 39 if (var7 != 3) { 40 System.arraycopy(var2, var14 - var13.length, var13, 0, var13.length); 41 } 42 } 43 44 var12[var14] = var2[var14]; 45 var12[var14 + 1] = var2[var14 + 1]; 46 var7 = var2[var14] << 8 & '＀' | var2[var14 + 1] & 255; 47 var8 = 0; 48 49 for(int var15 = 0; var15 < var12.length - 2; ++var15) { 50 var8 += var12[var15] & 255; 51 } 52 53 var8 &= 65535; 54 if (var8 != var7) { 55 throw new PGPException("checksum mismatch: passphrase wrong, expected " + Integer.toHexString(var7) + " found " + Integer.toHexString(var8)); 56 } 57 } 58 } catch (PGPException var10) { 59 throw var10; 60 } catch (Exception var11) { 61 throw new PGPException("Exception decrypting key", var11); 62 } 63 } else { 64 var12 = var2; 65 } 66 67 return var12; 68 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

secring.gpgの内容を削除して鍵を再度生成しなおしたらエラーが発生しなくなりました。

投稿2020/03/27 18:34

ikjmyh

総合スコア7

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

JAVA

1 for(var7 = 0; var7 != var6.length; ++var7) { 2 if (var6[var7] != var12[var12.length - var6.length + var7]) { 3 throw new PGPException("checksum mismatch at " + var7 + " of " + var6.length); 4 } 5 }

ここで例外を出してますね。
ここの条件文がなにをしてるかをよく考えてみては。

投稿2020/03/26 13:35

編集2020/03/26 13:36
y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問