単純な Xades/BES 実装と 2 つの状況があります。
Java を使用する Windows 7 32 ビットの場合
java version "1.7.0_25" Java(TM) SE Runtime Environment (build 1.7.0_25-b17) Java HotSpot(TM) Client VM (build 23.25-b01, mixed mode)
Windows 2008 Server 64 ビットで、同じ JVM を使用。
私のアプリケーションは 32 ビットの Windows 7 で問題なく動作しますが、コンパイルしたコードを Windows 2008 Server で実行しようとすると、次のエラーが発生します。
javax.crypto.BadPaddingException: Data must start with zero
at sun.security.rsa.RSAPadding.unpadV15(Unknown Source)
at sun.security.rsa.RSAPadding.unpad(Unknown Source)
at com.sun.crypto.provider.RSACipher.doFinal(RSACipher.java:349)
at com.sun.crypto.provider.RSACipher.engineDoFinal(RSACipher.java:382)
at javax.crypto.Cipher.doFinal(Cipher.java:2087)
問題のあるコード フィールドは次のとおりです。
public static byte[] getDecryptedSignatureValue(XMLSignature signature) throws XadesElementException, InvalidKeyException
{
byte[] signatureValue = null;
try {
KeyInfo keyInfo = signature.getKeyInfo();
PublicKey key = keyInfo.getPublicKey();
Cipher cipher = getCipher("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.DECRYPT_MODE, key);
signatureValue = signature.getSignatureValue();
byte[] cipherData = cipher.doFinal(signatureValue);
return cipherData;
} catch (KeyResolverException | XMLSignatureException | IllegalBlockSizeException | BadPaddingException ex) {
Logger.getLogger(KeyUtils.class.getName()).log(Level.SEVERE, null, ex);
Logger.getLogger(KeyUtils.class.getName()).log(Level.SEVERE, null, "SignatureValue:"+ BaseUtils.toBase64String(signatureValue));
} finally {
}
return null;
}
私が思いつくことができる唯一のものは、アーキテクチャの違いです。ここで何か不足していますか?何が問題になる可能性がありますか?
前もって感謝します。
編集: これが私の新しい発見です。1. Windows 7 64 ビットでアプリケーションをテストしましたが、署名と検証中に問題はありませんでした。2. さらに興味深いことに、別の Windows 2008 Server 64 ビットでアプリケーションをテストしたところ、問題なく動作しました。
何かの構成設定があると思いますが、何がわかりませんでした。