2016-11-18 10 views
2

私はC#からjavaにコードを移植しようとしています。 RSA/Sha1を使用して文字列を署名する必要がある部分があります。C#でJavaで署名されたものを確認する

JavaコードがC#コードと同じ結果を生成することを確認するために、javaから文字列に署名し、既存のC#コードを使用して署名を検証しようとしました。私の挑戦は、私はJavaで署名された文字列を検証できません。

ここにコードがあります。

署名のためのJavaメソッド:署名のための

public static String signPayload(byte[] stringToSign, PrivateKey privateKey){ 
    try { 
     Signature rsaSignatureProvider = Signature.getInstance("SHA1withRSA"); 
     rsaSignatureProvider.initSign(privateKey); 
     rsaSignatureProvider.update(stringToSign); 
     byte[] signature = rsaSignatureProvider.sign(); 
     return new String(Base64.encodeBase64String(signature)); 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 

    return null; 
} 

C#の方法:私は署名されたデータを検証するために使用しています

public String signPayload(String stringToSign, AsymmetricAlgorithm privateKey) 
{ 

    var hash = sha1.ComputeHash(Convert.FromBase64String(stringToSign)); 
    RSACryptoServiceProvider cryptoProv = (RSACryptoServiceProvider)privateKey; 
    return Convert.ToBase64String(cryptoProv.SignHash(hash, CryptoConfig.MapNameToOID("SHA1"))); 
} 

C#の方法:

public bool verifyHash(String signature, String stringToSign, PublicKey publicKey) 
{ 
    bool isVerified = false; 
    var responseHash = sha1.ComputeHash(Convert.FromBase64String(stringToSign)); 
    RSACryptoServiceProvider publicKeyCrypto = (RSACryptoServiceProvider)publicKey.Key; 
    isVerified = publicKeyCrypto.VerifyHash(responseHash, CryptoConfig.MapNameToOID("SHA1"), Convert.FromBase64String(signature)); 
    return isVerified; 
} 

私がすることができません2つの署名方法(JavaとC#)の間のギャップを参照してください。 Javaコードで間違っているのは何ですか?

答えて

2

私は署名をエンコードする方法を変更することで私の問題を解決することができました。以下はコードです。

public static String signPayload(byte[] stringToSign, PrivateKey privateKey) { 
    try { 
     Signature rsaSignatureProvider = Signature.getInstance("SHA1withRSA"); 
     rsaSignatureProvider.initSign(privateKey); 
     rsaSignatureProvider.update(stringToSign); 
     byte[] signature = rsaSignatureProvider.sign(); 

     return java.util.Base64.getEncoder().encodeToString(signature); 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
    return null; 
} 
関連する問題