2017-04-20 2 views
0

최근에 RSA를 사용하여 Java에서 문자열에 서명하고 C++에서 서명을 확인해야합니다. 자바에서Java에서 RSA 서명을 생성하지만 C++에서 서명이 실패했는지 확인

가, 지금은 내가 public.keystore 및 private.keysore을 작성하고 내가 C++에서 그것을 확인하려고 할 때 데이터 successfully.But veify & &에 서명 할 수 있습니다, 모든 일이 OK라고 생각, 그것은 서명이 실패 보여줍니다.

Java에서 Java 코드로 base64String에 데이터를 서명하고 "sig.dat"로 로컬에 저장합니다. 서명 한 데이터는 "signed.dat"로 저장됩니다.

public static String sign(byte[] data, String privateKey) throws Exception { 
    byte[] keyBytes = Base64.decodeBase64(privateKey); 
    Base64.decodeBase64(privateKey); 
    PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes); 
    KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); 
    PrivateKey privateK = keyFactory.generatePrivate(pkcs8KeySpec); 
    Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM); 
    signature.initSign(privateK); 
    signature.update(data); 
    return Base64.encodeBase64String(signature.sign()); 
} 

는 sig.dat 및 signed.dat 파일을 생성 :

여기
String signStr = RSAUtils.sign("123".getBytes(), privateKey2); 
boolean result = RSAUtils.verify("123".getBytes(), publicKey2, signStr); 
System.out.println("result:" + result); 


FileOutputStream fos = new FileOutputStream("signed.dat"); 
DataOutputStream dos = new DataOutputStream(fos); 
dos.write("123".getBytes()); 
dos.close(); 

FileOutputStream fos2 = new FileOutputStream("sig.dat"); 
DataOutputStream dos2 = new DataOutputStream(fos2); 
dos2.write(Base64.decodeBase64(signStr)); 

내 C++ 코드, 내가 파일을로드한다 "signed.dat"와 "sig.dat"로를 그것을 확인하기 위해 API를 사용하십시오 :

void Verify() 
{ 
    //Read public key 
    CryptoPP::ByteQueue bytes; 
    FileSource file("pubkey.txt", true, new Base64Decoder); 
    file.TransferTo(bytes); 
    bytes.MessageEnd(); 
    RSA::PublicKey pubKey; 
    pubKey.Load(bytes); 

    RSASSA_PKCS1v15_SHA_Verifier verifier(pubKey); 

    //Read signed message 
    string signedTxt; 
    FileSource("signed.dat", true, new StringSink(signedTxt)); 
    string sig; 
    FileSource("sig.dat", true, new StringSink(sig)); 

    string combined(signedTxt); 
    combined.append(sig); 

    cout << "signedTxt------------:" << signedTxt<< endl; 
    cout << "sig------------:" << sig << endl; 
    //Verify signature 
    try 
    { 
     StringSource(combined, true, 
      new SignatureVerificationFilter(
       verifier, NULL, 
       SignatureVerificationFilter::THROW_EXCEPTION 
      ) 
     ); 
     cout << "Signature OK" << endl; 
    } 
    catch (SignatureVerificationFilter::SignatureVerificationFailed &err) 
    { 
     cout << err.what() << endl; 
    } 

} 
+0

왜 태그에 openssl이 있습니까? 암호 ++를 사용하지 않습니까? –

+0

서명을 검증하기 위해'openssl'을 사용하려고 시도 했습니까? – Slava

+0

@Slava, 아니 .....하지만 지금은 여전히 ​​솔루션을 찾지 못해서 지금까지 openssl을 시험해보고 싶습니다. – AdvancingEnemy

답변

-2
string combined(signedTxt); 
combined.append(sig); 

그것은 누구의 서명이 확인 될 데이터에 디지털 서명을 추가 할 이해가되지 않습니다. 디지털 서명을 만들 때 디지털 서명 자체가 포함되지 않았습니다. 왜 확인해야 할 데이터에 디지털 서명을 포함시킬 것입니까?

+0

나는 doc wiki, Signature Scheme (PKCS v1.5), https://www.cryptopp.com/wiki/RSA_Cryptography#Signature_Schemes에 따라이 작업을 수행한다. – AdvancingEnemy