簡體   English   中英

在 C# 中驗證什么是在 Java (RSA) 中簽名的問題

[英]Problem verifying in C# what was signed in Java (RSA)

我希望我能在這里得到一些幫助,這樣我就可以最終解決這個令人沮喪的問題。

在 Java 方面,他們使用以下代碼簽名:

public static void main(String[] args) throws Exception {
    if (args.length < 2)
        printInfoAndExit();
    String cmd = args[0];
    Security.addProvider(new BouncyCastleProvider());
    Signature signature = Signature.getInstance("SHA1withRSA", "BC");
    if ("sign".equalsIgnoreCase(cmd)) {
        String pemFileName = args[1];
        String dataFileName = args[2];

        byte[] data = readFile(dataFileName);

        FileReader fr = new FileReader(new File(pemFileName));
        PEMReader pemReader = new PEMReader(fr);
        KeyPair keyPair = (KeyPair) pemReader.readObject();
        fr.close();

        signature.initSign(keyPair.getPrivate());
        signature.update(data);
        byte[] signatureBytes = signature.sign();

        writeFile(signatureBytes, dataFileName + ".signed");
        String encoded = Base64.encode(signatureBytes);
        writeFile(encoded.getBytes(), dataFileName + ".signed.base64");
    } else {
        printInfoAndExit();
    }
}

當我收到數據時,我有他們的公鑰並嘗試使用以下 C# 代碼進行驗證:

public static bool Verify(String msg, String signature, String publicKey)
{
    RsaKeyParameters remotepubkey = GetRsaPublicKey(publicKey);

    ISigner signer = SignerUtilities.GetSigner("SHA1withRSA");

    signer.Init(false, remotepubkey);
    byte[] sigBytes = Convert.FromBase64String(signature);
    byte[] msgBytes = Encoding.Default.GetBytes(msg);
    signer.BlockUpdate(msgBytes, 0, msgBytes.Length);
    return signer.VerifySignature(sigBytes);
}

這是行不通的!! 但是,我可以使用 openssl 驗證數據: openssl dgst -sha1 -verify public_key.pem -signature data.txt.signed data.txt

問題是,我缺少什么才能完成這項工作?

注意:我的密鑰沒有問題,它工作正常,但不知何故,java 和 .net 與 RSA 的工作方式有什么不同?

**編輯 1 :**在這個特定場景中,我所要做的就是將 GetSigner 更改為

ISigner signer = SignerUtilities.GetSigner("RSA");

有人能告訴我 SHA1withRSA 和 RSA 之間的區別嗎?

這個問題實際上是在Java端解決的。 他們在事情上有一些問題。

您的消息數據可能存在編碼問題。 您已將原始文件數據轉換為 unicode 字符串,並嘗試將其轉換回原始字節。 根據文件的編碼,如果它甚至是文本,您的 msgBytes 可能與實際文件內容不同。

從文件中讀取原始字節而不是字符串。 您沒有顯示實際讀取文件數據的代碼,但我假設您將其作為文本讀取。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM