2010-04-23 85 views
8

Tôi đang mã hóa trên JAVA bằng cách sử dụng RSA và cố gắng giải mã bằng .NET. Tôi bao gồm mã JAVA và mã .NET của tôi với hy vọng rằng ai đó có một số kinh nghiệm với loại điều này.Mã hóa Java RSA - Giải mã .NET

JAVA Mã số:

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); 

Từ Mã JAVA này tôi lấy kết quả của encryptedString mà xảy ra được:

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

Và cố gắng giải mã bằng mã .NET sau

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

oh, và lỗi tôi nhận được là "dữ liệu xấu" – badMonkey

+0

Hi @badMonkey, tôi đã có một câu hỏi. Bạn lấy XML từ đâu? Tôi không nhận được phần đó, nó có rất nhiều tham số (Q, P, DP, DQ, InverseQ, D). Đồng nghiệp java của tôi đang mã hóa một văn bản và nhà phát triển C# xảy ra là tôi nên giải mã nó. Ông đã cho tôi mô-đun và số mũ, làm cách nào tôi có thể quản lý để giải mã chuỗi được mã hóa bằng cách sử dụng mô-đun và số mũ? –

+0

Tôi không quá chắc chắn cái nào là cái nào, nhưng tôi khá chắc chắn rằng video minh họa hay này từ quý ông này https://youtu.be/oOcTVTpUsPQ giải thích những câu hỏi tôi đã hỏi trong phần bình luận trước. Chúc may mắn. –

Trả lời

7

Về phía Java, bạn cần phải sử dụng "RSA/ECB/PKCS1Padding" như tên gọi thuật toán. Với tên đồng bằng "RSA", Java không thêm vùng đệm PKCS#1 mà triển khai C# mong đợi, do đó là "dữ liệu xấu".

Đệm là một phép biến đổi dữ liệu đầu vào (chuỗi được mã hóa của bạn) thành chuỗi có kích thước lớn hơn có chiều dài giống với mô đun RSA (128 byte tại đây). Điều quan trọng là bảo mật và tiêm một số ngẫu nhiên (chuỗi đầu vào tương tự sẽ không mang lại cùng một chuỗi được mã hóa mỗi lần, nhưng quá trình giải mã loại bỏ tính ngẫu nhiên đó và phục hồi chuỗi bên phải).

+0

Luôn xác định rõ ràng chế độ và đệm trong Java vì không có đảm bảo về những gì sẽ được sử dụng khi bạn không. C# /. NET có một số tương đương tôi tự hỏi? – laz

+0

Thomas Tôi hy vọng bạn luôn ở xung quanh khi tôi gặp vấn đề về mã hóa! Điều đó hoàn toàn khắc phục được vấn đề. laz - RSACryptoServiceProvider.KeyExchangeAlgorithm là thuộc tính bạn đã đặt. Mặc định (như Thomas Pornin đã chỉ ra) là "RSA-PKCS1-KeyEx". – badMonkey

+0

No. Nếu bạn chỉ định Cipher.getInstance ("RSA"), bạn sẽ nhận được "RSA/ECB/PKCS1Padding". –

Các vấn đề liên quan