문제

나는 일부 c# 코드를 Java의 동등한 것으로 변환하려고합니다.

C# 코드는 일부 문자열 컨텐츠와 서명 (개인 키를 사용하여 생성, 별도 기계에서 생성)을 취하고 공개 키와 결합하여 서명 일치를 확인하여 요청이 변조되지 않았다는 보증 수준을 제공합니다.

  public bool VerifySignature(string content, byte[] signatureBytes, AsymmetricAlgorithm publicKey)
  {
        var hash = new MD5CryptoServiceProvider();

        byte[] dataBuffer = Encoding.ASCII.GetBytes(content);

        var cs = new CryptoStream(Stream.Null, hash, CryptoStreamMode.Write);
        cs.Write(dataBuffer, 0, dataBuffer.Length);
        cs.Close();

        var deformatter = new RSAPKCS1SignatureDeformatter(publicKey);
        deformatter.SetHashAlgorithm("MD5");

        return deformatter.VerifySignature(hash, signatureBytes);
  }

공개 키 자체는 X509 인증서입니다. .CER 파일로 구성된 X509 인증서입니다. 즉, 어셈블리 리소스 IE로 저장됩니다.

byte[] data; // data is read from a resource stream.
var publicKey = new X509Certificate2(data, "", X509KeyStorageFlags.MachineKeySet).PublicKey.Key

내가 원하는 것은 Java 에서이 기능을 모방하는 것입니다. 그래서 C#의 일부 코드로 생성 된 서명을 확인할 수 있습니다 ... Java의 암호화 기능을 조사하기 시작했지만 약간의 Java 멍청이입니다. . 지금까지 내가 생각해 낸 내용은 다음과 같습니다.

byte[] certContents=null;
byte[] signature=null;
String contents = "abc";

// load cert
CertificateFactory factory = CertificateFactory.getInstance("X.509");
X509Certificate cert = (X509Certificate) factory.generateCertificate(new ByteArrayInputStream(certContents));

// grab public key
RSAPublicKey publicKey = (RSAPublicKey)cert.getPublicKey();

// get sha1 hash for contents        
Mac mac = Mac.getInstance("HmacSHA1");
mac.update(contents.getBytes());                
byte[] hash = mac.doFinal();

// get cipher
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, publicKey);

// verify signature of contents matches signature passed to method somehow (and this is where I'm stuck)

누구나 내가 서명을 검증하는 방법에 대한 통찰력을 제공하거나 Java.Crypto 및 Java.Security.Cert 사용량을 Mill Java 문서의 실행보다 더 잘 설명 할 수있는 일부 리소스에 대한 링크를 제공 할 수 있습니까?

도움이 되었습니까?

해결책

그 c# 코드는 나에게 정말 혼란스러워 보입니다. SHA1CryptoserviceProvider를 사용하지만 MD5 해시를 사용하므로 사용중인 해싱 알고리즘을 알 수 없습니다. 나는 그것이 MD5라고 가정합니다.

서명 검증 프로세스에는 코드가 작동하지 않도록 패딩이 포함됩니다. 다음은 내 코드의 스 니펫이며 서명을 확인하는 데 사용할 수 있습니다. 데이터는 서명 할 바이트이며 Sigbytes는 서명을 보유합니다.

String algorithm = "MD5withRSA";

// Initialize JCE provider    
Signature verifier = Signature.getInstance(algorithm);

// Do the verification   
boolean result=false;

try {
    verifier.initVerify(cert); // This one checks key usage in the cert
    verifier.update(data);
    result = verifier.verify(sigBytes);
}
catch (Exception e) {
    throw new VerificationException("Verification error: "+e, e);
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top