2010-04-23 2 views
8

RSA를 사용하여 JAVA에서 암호화하고 .NET을 사용하여 해독하려고합니다. 나는 JAVA 코드와 .NET 코드를 포함시켜 누군가가 이런 종류의 경험을 가지고 있기를 희망한다.자바 RSA 암호화 - 암호 해독

자바 코드 :

byte[] modulusBytes = Base64.decode("xTSiS4+I/x9awUXcF66Ffw7tracsQfGCn6g6k/hGkLquHYMFTCYk4mOB5NwLwqczwvl8HkQfDShGcvrm47XHKUzA8iadWdA5n4toBECzRxiCWCHm1KEg59LUD3fxTG5ogGiNxDj9wSguCIzFdUxBYq5ot2J4iLgGu0qShml5vwk="); 
byte[] exponentBytes = Base64.decode("AQAB"); 
BigInteger modulus = new BigInteger(1, modulusBytes); 
BigInteger exponent = new BigInteger(1, exponentBytes); 

RSAPublicKeySpec rsaPubKey = new RSAPublicKeySpec(modulus, exponent); 
KeyFactory fact = KeyFactory.getInstance("RSA"); 
PublicKey pubKey = fact.generatePublic(rsaPubKey); 

Cipher cipher = Cipher.getInstance("RSA"); 
cipher.init(Cipher.ENCRYPT_MODE, pubKey); 

byte[] plainBytes = new String("big kitty dancing").getBytes("UTF-8"); 
byte[] cipherData = cipher.doFinal(plainBytes); 
String encryptedString = Base64.encodeBytes(cipherData); 

이 자바 코드에서 내가 할 일어나는 encryptedString의 결과를 가지고 :

FoP4 + AAIH6hcabXnrvNG5YUk/nBv9n9HU0CAgZjkIWQIDjbOpSwoPVBFERrZ6641x2QaoJw5yv18XAay + 0WrCaSw4sveRX + hmPm5qeVUPcjoR4slsVZ/hBFJtAHj9tva4hOugWDZa9s3RVJlxkNfE + U +의 Kt/YKLOi2EYbH05HjeM =

그리고 다음 .NET 코드를 사용하여 암호 해독을 시도하십시오.

const int PROVIDER_RSA_FULL = 1; 
const string CONTAINER_NAME = "Tracker"; 

CspParameters cspParams; 
cspParams = new CspParameters(PROVIDER_RSA_FULL); 
cspParams.KeyContainerName = CONTAINER_NAME; 
RSACryptoServiceProvider rsa1 = new RSACryptoServiceProvider(cspParams); 
rsa1.FromXmlString("<RSAKeyValue><Modulus>xTSiS4+I/x9awUXcF66Ffw7tracsQfGCn6g6k/hGkLquHYMFTCYk4mOB5NwLwqczwvl8HkQfDShGcvrm47XHKUzA8iadWdA5n4toBECzRxiCWCHm1KEg59LUD3fxTG5ogGiNxDj9wSguCIzFdUxBYq5ot2J4iLgGu0qShml5vwk=</Modulus><Exponent>AQAB</Exponent><P>+lXMCEwIN/7+eMpBrq87kQppxu3jJBTwztGTfXNaPUTx+A6uqRwug5oHBbSpYXKNDNCBzVm/0VxB3bo4FJx+ZQ==</P><Q>yasOGaJaE9xlF9T2xRuKeG9ZxCiyjhYaYB/mbtL+SIbtkRLi/AxaU4g2Il/UxhxhSXArKxIzV28zktispPJx1Q==</Q><DP>ueRgQIEFUV+fY979a1RgrVHIPpqEI1URhOMH3Q59oiXCcOumM5njyIHmWQxRAzXnG+7xlKXi1PrnRll0L4oOKQ==</DP><DQ>dfEMNgG1HJhwpxdtmqkYuoakwQvsIRzcIAuIAJh1DoWaupWJGk8/JEstHb1d+t7uJrzrAi2KyT/HscH2diE0YQ==</DQ><InverseQ>YoYF9PF6FiC0YngVeaC/eqt/ea8wMYNN3YO1LuzWpcy2exPRj2U0ZbWMvHXMUb4ea2qmhZGx1QlK4ULAuWKpXQ==</InverseQ><D>g1WAWI4pEK9TA7CA2Yyy/2FzzNiu0uQCuE2TZYRNiomo96KQXpxwqAzZLw+VDXfJMypwDMAVZe/SqzSJnFEtZxjdxaEo3VLcZ1mnbIL0vS7D6iFeYutF9kF231165qGd3k2tgymNMMpY7oYKjS11Y6JqWDU0WE5hjS2X35iG6mE=</D></RSAKeyValue>"); 

string data2Decrypt = "FoP4+AAIH6hcabXnrvNG5YUk/nBv9n9HU0CAgZjkIWQIDjbOpSwoPVBFERrZ6641x2QaoJw5yv18XAay+0WrCaSw4sveRX+hmPm5qeVUPcjoR4slsVZ/hBFJtAHj9tva4hOugWDZa9s3RVJlxkNfE+u+Kt/YKLOi2EYbH05HjeM="; 

byte[] encyrptedBytes = Convert.FromBase64String(data2Decrypt); 

byte[] plain = rsa1.Decrypt(encyrptedBytes, false); 
string decryptedString = System.Text.Encoding.UTF8.GetString(plain); 
+0

오, 내가받는 오류는 "불량 데이터"입니다. – badMonkey

+0

안녕하세요 @badMonkey, 질문이 있습니다. 어디서 XML을 가져 왔습니까? 나는 그 부분을 얻지 못한다. 그것은 많은 매개 변수 (Q, P, DP, DQ, InverseQ, D)를 가진다. 내 java 동료가 텍스트를 암호화하고 C# 개발자가 나를 해독해야합니다. 그는 나에게 모듈러스와 지수를주었습니다. 어떻게 모듈러스와 지수를 사용하여 암호화 된 문자열의 암호를 해독 할 수 있습니까? –

+0

어느 쪽이 어느 쪽인지는 잘 모르겠지만,이 신사 인 https://youtu.be/oOcTVTpUsPQ의이 멋진 설명 동영상이 내가 이전 댓글에서 물어 본 질문에 대해 설명하고 있음을 확신합니다. 행운을 빕니다. –

답변

7

Java 측에서 알고리즘 이름으로 "RSA/ECB/PKCS1Padding"을 사용해야합니다. 일반 "RSA" 이름을 사용하면 Java에서는 C# 구현에서 예상하는 패딩 인 PKCS#1을 추가하지 않으므로 "불량 데이터"가 발생합니다.

패딩은 입력 데이터 (인코딩 된 문자열)를 RSA 모듈러스 (여기서는 128 바이트)와 길이가 같은 다소 큰 문자열로 변환합니다. 보안을 위해 중요하며 무작위성을 주입합니다 (동일한 입력 문자열은 매번 동일한 암호화 문자열을 생성하지 않지만 해독 프로세스는 임의성을 제거하고 그럼에도 불구하고 올바른 문자열을 복구합니다).

+0

Java에서 모드와 패딩을 항상 명시 적으로 정의하십시오. 그렇지 않을 경우 사용할 내용에 대한 보장이 없기 때문에 항상 모드와 패딩을 Java로 정의하십시오. C#/.NET에는 당연히 동일한 기능이 있습니까? – laz

+0

토마스 나는 암호화 문제가있을 때 항상 주변에 있기를 바랍니다. 그것은 절대적으로 문제를 해결했습니다. laz - RSACryptoServiceProvider.KeyExchangeAlgorithm은 사용자가 설정하는 속성입니다. 기본값 (Thomas Pornin이 지적한대로)은 "RSA-PKCS1-KeyEx"입니다. – badMonkey

+0

아니요. Cipher.getInstance ("RSA")를 지정하면 "RSA/ECB/PKCS1Padding"이 표시됩니다. –

관련 문제