우리는 텍스트를 암호화하고 암호 해독하고 데이터베이스에 저장하는 .Net 응용 프로그램을 가지고 있습니다. .NET 개발자가 RSA 키를 XML 형식으로 저장했다는 것을 알게되었습니다. 그들이 암호화를 수행 한 경우 텍스트는 다음과 같은 패턴을 사용하여 데이터베이스에 저장됩니다. NET RSA 암호화, Java RSA 암호 해독
0D-E4-1D-91-44-2B-B5-3B-03-34...and so on (total of 383 characters)
우리는 자바 플랫폼에 대한 기존의 .NET 응용 프로그램을 포팅하고 있습니다. 이를 위해 기존의 인코딩 된 데이터를 사용하여 디코딩해야합니다.
나는 다음과 같은 자바 코드를 작성했습니다 (인터넷에서 붙여 복사 - 나는 RSA에 대한 이해와 암호화의 어떤 종류가없는)
public String decryptText (byte[] encryptedText) throws Exception {
String decryptedText = null;
if (rsaData != null) {
byte[] modBytes = Base64.decodeBase64(rsaData.getModulus().trim());
byte[] dBytes = Base64.decodeBase64(rsaData.getD().trim());
BigInteger modules = new BigInteger(1, modBytes);
BigInteger d = new BigInteger(1, dBytes);
KeyFactory factory = KeyFactory.getInstance("RSA");
Cipher cipher = Cipher.getInstance("RSA");
RSAPrivateKeySpec privSpec = new RSAPrivateKeySpec(modules, d);
PrivateKey privKey = factory.generatePrivate(privSpec);
cipher.init(Cipher.DECRYPT_MODE, privKey);
byte[] decrypted = cipher.doFinal(encryptedText);
decryptedText = new String(decrypted);
}
return decryptedText;
}
곳 XML 데이터를 보유 rsaData = 참조. 내 XML은 다음과 같습니다
<RSAKeyValue>
<Modulus>
ynKHV6Tm/tV7ZsTRMLNjMqlAkbftMXA/OkM5zi6+ih371Jgi6ZNX2T4ml0DmK1hojwumHadiX3YoPlaJ/xiys4NRxbDH9VuJJeTdZvoB8heKxACaIw9l1CCTEkx3jYVJ+h6M10fV3wChD0BOtiLg3rMO64LpR2DAGZNbVjXL3h0=
</Modulus>
<Exponent>AQAB</Exponent>
<P>5QUpIuwCOqR03GqI0K7Y4yWn0hvYa7b9RkCA9Y1QQ0IyBqfiTYOT87cKBRsu4FxH6tdY0khfFCskFgumx22gOw==</P>
<Q>4kv69rnEMxSOzmg4ZkAuxrUc6wZCuIJAgSL9gGBFukQSIB6UVWXYhNUDzklcMtGE/lRmwJvwSIlpZBlVtlYthw==</Q>
<DP>ae7LKlYUad+sFlBI3I4j0F2YlL1AjAJmgNpRTEODPrkdvqplKQmVpAOkZNxAAJNuyJe3g/zpzcBuvqvBBzoUBQ==</DP>
<DQ>M+iL27aG+9SWYWBkt4e3cxsuU/burRYrp7OYBK+QrwZYRgfdrK0c+nNGWTZYsMuAvzorC7l5Z5olk7GACMBB1w==</DQ>
<InverseQ>
UuLEf34YsvFxzgzKhdONvFhsSDRleC5rPR/XvpJl9NEikwXQHTr4547hYM+4soHRdBaiUFdzNtxLMlRW481L1A==
</InverseQ>
<D>
aNSFYMzzEGJbVAv2htFdPI6H8Ozc1gzZsMG+3RU3dS2xiZR9/5VcmBGmygvBJBDTk77kddaHCgeVLzKAoqeXYJGJgiNQgByE+jQz70HkOaAy0muNbAxLOk9UY6lkJ9kVbtSu1LyR83yj4+kSGNo4T63LBKV07TirAhDMJAk3o8E=
</D>
</RSAKeyValue>
나는 다음과 같은 오류 얻을 인코딩 된 텍스트로 전달하여 decryptText() 메서드를 호출 :
Exception in thread "main" javax.crypto.IllegalBlockSizeException: Data must not be longer than 128 bytes
at com.sun.crypto.provider.RSACipher.a(DashoA13*..)
at com.sun.crypto.provider.RSACipher.engineDoFinal(DashoA13*..)
누군가가이 문제를 해결하는 데 도움 주실 수 있습니까? 또는 유용한 링크를 가리 킵니까?
그래서 몇 시간 동안 고민 한 후 나는 한 다음
다음과 같이 내 decryptText() 메소드에 두 줄을 업데이트 :
KeyFactory factory = KeyFactory.getInstance("RSA");
Cipher cipher = Cipher.getInstance("RSA/ECB/NOPADDING");
내가 암호화 된 문자열이 것을 깨달았다 HEX로 코드화하여 다시 되돌려 놓았습니다. 그래서 (대시를 제거한 후) 원래 문자열이되었다 :
1322829145684318159352601201165341161130212111239120172192552382321681005365571520823020721395242114149106119101747920169161831211748781201152821423521012222201691166150158120221052590252851921052281199918638104578159158115138861911531100176209133541522422481711310198179214164975320920468140732925421720220119120115314722510613321
역방향 진수가 된 후 어느 :
ä?D+µ;4<xt5)¡?Ôoïx¬ÿîè¨d5A9?æÏÕ_òr?jw®OÉE·y0Nx?ÖëÒ?©???xiZüUÀiäwcº&hN??s?V¿?d°Ñ?6?òø«Æ?Ö?a5ÑÌD?I?ÙÊÉ¿É??áj?
나는 나의 위 decryptText() 메서드에이 문자열을 통과시켰다. 나는 정상적인 사람이 읽을 수있는 문자열을 다시 인쇄 할 것으로 기대했지만 다음 문자열이 있습니다.
&LÑP źç–4õ∂Ôı)¬' Ó.fi—Ø€Âótiø?R”ÀNQ°≥Y¶B˚w»Rüaûr>Vœ&˙◊@Ë¡.e¿–5 ÉP3ŒJjü&è˛LCÔ@Ÿ$‰=êyôázwQå{<7 ŸR‘BîóÅWÎhŸyÈ[èR
그래서 누가 도와 줄 수 있습니까?