2009-05-27 5 views
2

이것은 현재 사용중인 코드입니다. BouncyCastle Provider를 사용합니다.RSA 공개 키를 사용하여 java.util.Properties 객체를 암호화하려면 어떻게해야합니까?

static 
{ 
    Security.addProvider(new BouncyCastleProvider()); 
} 

protected String encrypt(byte[] keyData, byte[] data) throws Exception { 
    X509EncodedKeySpec keyspec = new X509EncodedKeySpec(keyData); 
    KeyFactory kf = KeyFactory.getInstance("RSA", "BC"); 
    PublicKey pk = kf.generatePublic(keyspec); 
    Cipher rsa = Cipher.getInstance("RSA/None/OAEPWithSHA1AndMGF1Padding", "BC"); 
    rsa.init(Cipher.ENCRYPT_MODE, pk); 
    byte[] output = rsa.doFinal(data); 
    String result = base64EncodeBytes(output); 
    return result; 
} 

나는 현재 많은 데이터를 암호화 RSA를 사용하여

java.lang.ArrayIndexOutOfBoundsException: too much data for RSA block 
    at org.bouncycastle.jce.provider.JCERSACipher.engineDoFinal(Unknown Source) 
    at javax.crypto.Cipher.doFinal(DashoA13*..) 
    at Encryption.encrypt(RSAToken.java:60) 
+0

NoPadding을 사용하는 것은 안전하지 않습니다. 가능한 경우 OAEP를 사용할 수 있으면 PKCS # 1 패딩 (버전 1.5)을 사용하십시오. – erickson

+0

OAEPWithSHA1AndMGF1Padding을 사용하도록 업데이트했습니다. 팁 고마워. 이것은 암호화에 대한 첫 벤처 기업입니다. 우리가 암호화하는 데이터 (라이센스 데이터)는 중요하지 않지만 더 많이 배울수록 좋습니다. – ScArcher2

답변

7

받고 있어요 것은 좋은 방법이 아닙니다.

암호화 프로토콜이 취하는 접근법은 대칭 키를 생성하고이를 사용하여 데이터를 암호화 한 다음 RSA로 해당 대칭 키를 암호화하는 것입니다.

PGP 및 S/MIME 작동 방식입니다. 또한 여러 독자가 각각의 수신자에 대해 전체 데이터를 암호화하지 않고 대칭 키를 암호화하여 데이터 —을 해독하는 것을 쉽게 허용합니다.

+0

좋은 연습이 아닌 보안상의 이유가 있습니까? AFAIK 이런 식으로 끝난 이유는 속도입니다. BouncyCastle은 단순히 그것을 지원하지 않으며, 옵션이 아니라는 것을 의미하지는 않습니다 ... – wds

+2

속도, 호환성 및 복잡성이 이런 식으로하지 않는 것이 좋습니다. 현재의 프랙티스에서 암호 해독 방법에 대한 취약성을 알지 못하지만,이 접근법은 암호에 대한 깊은 이해가없는 사람이 작성하는 코드가 더 많아야하므로 확실히 안전하지 않습니다. BouncyCastle의 S/MIME 또는 PGP 라이브러리를 사용하는 것이 좋습니다. 광범위하게 검토 된 프로토콜과 구현을 사용하는 것이 자신을 발명하는 것보다 훨씬 안전합니다. – erickson

+0

이것은 모든 것을 나에게 분명하게했다. 감사! – ScArcher2

관련 문제