2017-04-06 5 views
4

이것은 this answered question과 중복 될 수 있지만 동일한 결과를 얻지 못하는 것 같습니다. 여기에 몇 가지 안내를 원합니다.RSA는 JSEncrypt를 사용하여 암호화하고 BouncyCastle (Java)을 사용하여 해독합니다.

JSEncrypt (클라이언트)

let encrypt = new Encrypt.JSEncrypt(); 
encrypt.setPublicKey(this.publicKey); // retrieved from server 
encrypt.encrypt(password); 

BouncyCastle (서버) - RSA 키 생성

KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA"); 
generator.initialize(1024); 
KeyPair pair = generator.generateKeyPair(); 
PublicKey pubKey = pair.getPublic(); 
PrivateKey privKey = pair.getPrivate(); 

// returned to client 
String publicKeyStr = new String(Base64.encodeBase64(pubKey.getEncoded())); 
String privateKeyStr = new String(Base64.encodeBase64(privKey.getEncoded())); 

BouncyCastle (서버) - 암호 해독

Cipher cipher = Cipher.getInstance("RSA/None/PKCS1Padding"); 
cipher.init(Cipher.DECRYPT_MODE, privateKey); 
// org.apache.commons.codec.binary.Hex 

byte[] cipherText = cipher.doFinal(Hex.decodeHex(encrypted.toCharArray())); 
decrypted = new String(cipherText, BaseConstant.ENC_UTF8); 

오류

org.apache.commons.codec.DecoderException : 인덱스 0에 올 Y 르지 않은 16 진 문자 I at org.apache.commons.codec.binary.Hex.toDigit (Hex.java:178) at org.apache.commons.codec 응답 한 256

서버 측에서 암호화를 생산하면서 .binary.Hex.decodeHex (Hex.java:89는) 내가 눈치

한 가지, 172 JSEncrypt에 의해 암호화 된 텍스트의 길이 RSA/None/PKCS1Padding을 사용하도록 언급 된 질문. 이미 설정 했었습니다. 그 밖의 무엇을 내가 놓칠 수 있습니까?

+0

예외는 암호 해독 관련이 없습니다. 고맙지 만, @Hugo가 제공 한 솔루션은 – Egl

+1

감사합니다. 이 작품! – acys

답변

2

Hex.decodeHex() 메서드에서 오류가 발생합니다. 즉, 데이터가 16 진수로 인코딩 된 문자열이 아닙니다.

JSEncrypt.encrypt() 메서드는 암호화 된 데이터를 16 진수 문자열 대신 Base64로 반환합니다. 해독하려면 base64 형식에서 해독해야합니다.

그래서 대신 :

byte[] cipherText = cipher.doFinal(Hex.decodeHex(encrypted.toCharArray())); 

는이 작업을 수행 :

byte[] cipherText = cipher.doFinal(Base64.decodeBase64(encrypted.toCharArray())); 
+0

Super!에 자리하고있었습니다. 예외는 Hex.decodeHex()에 의해 던졌습니다. – acys

+1

좋아요! 효과가 있고 유용한 것으로 밝혀지면 응답을 upvote 및/또는 수락 할 수 있습니다 (좋은 습관 임에도 불구하고 필수 사항은 아닙니다) –

+1

upvoting을 시도했지만 충분한 평판 포인트가 없다고 말합니다. ( – acys