2

問題があり、解決できません。Linux で署名オブジェクトを作成し、Windows で検証しようとすると失敗します。逆も同じです。1 つのプラットフォームにとどまっていれば、すべて問題ありません。

最初にエンコーディングについて考えたので、 -Dfile.encoding を異なる標準に設定するなどのテストを開始しました。しかし、UTF-8 を使用して署名を作成し、windows-1215 を使用して検証したとしても、同じプラットフォームを使用していれば問題ありません。

コードは非常に基本的なもので、問題が見つかりません:

署名の作成:

public void signData(File fileToSign, String outPutFileName)...
{
    Signature dsa = Signature.getInstance("DSA");
    dsa.initSign(privateKey);

    byte[] bytesToSign = FileUtils.readByteArrayFromFile(fileToSign);
    dsa.update(bytesToSign);

    byte[] sigData = dsa.sign();
    FileUtils.saveByteArrayToFile(outPutFileName, sigData);
}

public static void saveByteArrayToFile(String outPutFileName, byte[] bytesToSave)...
{
    FileOutputStream fos = new FileOutputStream(outPutFileName);
    fos.write(Base64.encodeBase64(bytesToSave));
    fos.close();
}

それを確認する:

public boolean isVerified(File fileToVerify, File signatureFile)...
{
    byte[] sigData = FileUtils.readByteArrayFromFile(signatureFile);

    Signature signature = Signature.getInstance("DSA");
    signature.initVerify(publicKey);

    byte[] byteToVerify = FileUtils.readByteArrayFromFile(fileToVerify);
    signature.update(byteToVerify);

    return signature.verify(sigData);
}

public static byte[] readByteArrayFromFile(File file)...
{
    FileInputStream fis = new FileInputStream(file);
    byte[] byteArray = new byte[fis.available()];
    fis.read(byteArray);
    fis.close();

    return Base64.decodeBase64(byteArray);
}

誰かが私を正しい方向に向けてくれることを願っています。
ありがとう。

よろしくお願いいたします。

4

1 に答える 1

1

私は最終的に解決策を見つけました。問題は確かにエンコーディングでした。今、私は自分のデータを逆エンコードしてエンコードするだけで、すべて問題ありません。それに応じてコードを更新しました。

于 2012-11-23T07:18:32.347 に答える