최근에 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;
}
}
왜 태그에 openssl이 있습니까? 암호 ++를 사용하지 않습니까? –
서명을 검증하기 위해'openssl'을 사용하려고 시도 했습니까? – Slava
@Slava, 아니 .....하지만 지금은 여전히 솔루션을 찾지 못해서 지금까지 openssl을 시험해보고 싶습니다. – AdvancingEnemy