한글 RSA 키로 일반 텍스트에 서명하고 Java에서 Base64로 인코딩하는 방법은 무엇입니까?




자바 디코더 (3)

나는 bash에 다음 코드를 가지고있다.

signed_request = $(printf "PLAIN TEXT REQUEST" | 
openssl rsautl -sign -inkey "keyfile.pem" | openssl enc -base64 | _chomp )

기본적으로이 코드는 일반 텍스트를 가져 와서 개인 키로 서명하고 Base64를 사용하여 인코딩합니다.

자바에서 정확히 같은 기능을 가진 코드를 어떻게 만들 수 있습니까?


JDK 보안 API를 사용할 수 있습니다. 이 작업 샘플을 살펴보면 시작할 수 있기를 바랍니다.

  public static void main(String[] args) throws Exception {
    KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
    kpg.initialize(1024);
    KeyPair keyPair = kpg.genKeyPair();

    byte[] data = "test".getBytes("UTF8");

    Signature sig = Signature.getInstance("MD5WithRSA");
    sig.initSign(keyPair.getPrivate());
    sig.update(data);
    byte[] signatureBytes = sig.sign();
    System.out.println("Singature:" + new BASE64Encoder().encode(signatureBytes));

    sig.initVerify(keyPair.getPublic());
    sig.update(data);

    System.out.println(sig.verify(signatureBytes));
  }

편집 : 위의 예제는 내부 Sun의 인코더 ( sun.misc.BASE64Encoder )를 사용합니다. Commons Codec Base64 와 같은 것을 사용하는 것이 가장 좋습니다.


또한 not-yet-commons-ssl 을 사용하여 파일에서 개인 키를 얻고 org.apache.commons.ssl.Base64 사용하여 인코딩 할 수 있습니다. Max의 예제 사용 :

import java.security.Signature;
import org.apache.commons.ssl.Base64;
import org.apache.commons.ssl.PKCS8Key;

// [...]

PKCS8Key pkcs8 = new PKCS8Key(new FileInputStream("keyfile.pem"),
                              "changeit".toCharArray());

Signature sig = Signature.getInstance("MD5WithRSA");
sig.initSign(pkcs8.getPrivateKey());
sig.update(data);
byte[] signatureBytes = sig.sign();

System.out.println("Singature: " +
                   Base64.encodeBase64String(signatureBytes));

나는 @Aqua라는 링크를 새로운 대답으로 게시했다. 왜냐하면 나는 아직 주어진 답변보다 훨씬 더 유용하다고 생각하기 때문이다. 이 파일을 사용하여 파일에서 개인 / 공개 키를 읽고 쓸 수 있습니다. http://codeartisan.blogspot.ru/2009/05/public-key-cryptography-in-java.html

이 링크는 서명과 확인에 관한 아무 것도 말하지 않지만 서명은 훨씬 쉽습니다. 이 코드를 사용하여 서명했습니다.

    Signature signature = Signature.getInstance("SHA256WithRSA");
    signature.initSign(privateKey);

    signature.update("text to sign".getBytes());
    signature.sign();

그리고 확인하려면 :

    Signature signature = Signature.getInstance("SHA256WithRSA");
    signature.initVerify(publicKey);
    signature.update("text to sign".getBytes);
    signature.verify(signatureMadeEarlier);






sign