2014-10-08 2 views
0

두 개의 키를로드했으며 그 중 하나를 사용하여 무언가에 서명 한 후이를 확인하려고하지만 어려움이 있습니다. 오류없이 끝에 "확인 : 거짓"이 표시됩니다. 누군가가 결함을 지적 할 수 있습니까?개인 및 공개 RSA 키가 일치하는지 확인

package fliesigning; 

import static fliesigning.FlieSigning.verifySig; 
import java.io.*; 
import java.nio.ByteBuffer; 
import java.security.*; 
import java.security.spec.PKCS8EncodedKeySpec; 
import java.security.spec.X509EncodedKeySpec; 
import java.math.BigInteger; 
import java.security.Provider; 
import java.security.Security; 
import java.security.interfaces.RSAPrivateKey; 
import java.security.interfaces.RSAPublicKey; 
import java.security.spec.RSAPrivateKeySpec; 
import java.security.spec.RSAPublicKeySpec; 
import javax.crypto.Cipher; 
import org.apache.commons.codec.binary.Base64; 

public class Signing { 
    private static final String BEGIN_RSA_PRIVATE_KEY = "<PRIVATE KEY>"; 
    private static final String BEGIN_RSA_PUBLIC_KEY = "<PUBLIC KEY>"; 

    public static void main(String[] args) throws Exception { 
    // Remove the first and last lines 
    String privKeyPEM = BEGIN_RSA_PRIVATE_KEY.replace("-----BEGIN RSA PRIVATE KEY-----\n", ""); 
    privKeyPEM = privKeyPEM.replace("-----END RSA PRIVATE KEY-----", ""); 
    System.out.println(privKeyPEM); 

    String publicKeyPEM = BEGIN_RSA_PUBLIC_KEY.replace("-----BEGIN PUBLIC KEY-----\n", ""); 
    publicKeyPEM = publicKeyPEM.replace("-----END PUBLIC KEY-----", ""); 
    System.out.println(publicKeyPEM); 

    // Base64 decode the data 
    Base64 b64 = new Base64(); 
    byte [] encoded = b64.decode(privKeyPEM); 
    byte [] encoded_pub = b64.decode(publicKeyPEM); 

    // PKCS8 decode the encoded RSA private key 
    PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(encoded); 
    KeyFactory kf = KeyFactory.getInstance("RSA"); 
    PrivateKey privKey = kf.generatePrivate(privateKeySpec); 

    X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(encoded_pub); 
    KeyFactory pk = KeyFactory.getInstance("RSA"); 
    PublicKey publicKey = pk.generatePublic(publicKeySpec); 

    // Display the results 
    System.out.println(privKey); 
    String file = "qwerty"; 
    byte[] fileBytes = file.getBytes(); 
    byte[] digitalSignature = signData(fileBytes, privKey); 
    System.out.println("SIGNATURE MADE"); 
    boolean verified; 
    verified = verifySig(fileBytes, publicKey, digitalSignature); 
    System.out.println("verified: " + verified) ; 
    } 

    public static byte[] signData(byte[] data, PrivateKey key) throws Exception { 
    Signature signer = Signature.getInstance("SHA256withRSA"); 
    signer.initSign(key); 
    signer.update(data); 
    return (signer.sign()); 
    } 

    public static boolean verifySig(byte[] data, PublicKey key, byte[] sig) throws Exception { 
    Signature signer = Signature.getInstance("SHA256withRSA"); 
    signer.initVerify(key); 
    signer.update(data); 
    return (signer.verify(sig)); 
    } 
} 

답변

1

코드가 제대로 작동하는 것처럼 보입니다. 키가 실제로 일치하지 않아야합니다.

  • openssl genrsa -out priv.pem

  • openssl pkcs8 -in priv.pem -out pk8.pem -topk8 -nocrypt
    (기본 RSA 개인 키를 생성)

  • openssl rsa -in priv.pem -pubout -out pub.pem
    (공개 키를 추출) : 내가 사용하는 몇 가지 테스트 키를 생성 (개 심자 pk8.pempub.pem : 암호화되지 않은 PKCS # 8 형식으로 개인 키)

이 나에게로 테스트하는 두 개의 파일을 주었다. 시작 코드와 종료 코드가 -----BEGIN PRIVATE KEY----------END PRIVATE KEY-----이되도록 코드를 약간 변경했습니다.

확인에 성공했습니다.

+0

아, 작동합니다. 감사합니다. 어떻게 든 코드를 최적화 할 수 있는지 물어보고 싶습니다. –

+0

또 다른 질문입니다. 어떻게 문자열 대신 파일에서 키를 읽을 수 있습니까? –

+0

@ davidguetta 첫 번째 질문은 http://codereview.stackexchange.com에 적합 할 수 있습니다. 게시하기 전에 도움말 페이지를 확인하십시오. 두 번째 질문은 Google이 귀하를 도울 것이라고 생각합니다. –

관련 문제