2009-10-20 3 views
0

RSA가 데이터를 암호화하고 C#으로 전달하는 모듈을 가지고 있습니다. C#은 공개 키 (64 비트 인코딩) 및 전달 된 토큰을 기반으로 해독해야합니다.Java 암호화 C# 암호 해독

나는 토큰, 64 비트 인코딩 된 공개 키를 가지고 있는데, 시작하기 위해 샘플을 얻는 데 도움이 될 수있다. Java 끝에서 내가 아는 것은 사용하고있는 것입니다. Java 끝에서 결과를 얻었으며이를 해독하기 위해 C#에서 파서를 작성해야합니다. 공개 키와 토큰을 모두 문자열 값으로 얻습니다.

Cipher cipher = Cipher.getInstance(ALGORITHM); //Algorithm = "RSA" 
    cipher.init(Cipher.DECRYPT_MODE, key); 

감사

+0

제 대답에 대한 업데이트를 확인하십시오. – erickson

답변

1

당신은 메시지를 해독하기 위해 개인 키가 필요합니다, 시작합니다. "공개 키 (64 비트 인코딩)"를 사용하면 실제로 Base-64 – 인 코드 된 인증서를 추측 할 수 있습니다. 헤더 행에는 "----- BEGIN CERTIFICATE -----"및 "----- END CERTIFICATE -----"라고 표시된 꼬리말.

맞으면 개인 키를 찾아야합니다. 이것은 때로는 ".p12"또는 ".pfx"확장자를 갖는 PKCS # 12 형식 파일에 저장됩니다. 이러한 파일에 개인 키가 저장되어있는 경우 개인 키에 액세스하려면 암호가 필요합니다.

또는 OpenSSL 및 기타 유틸리티는 Base-64 – 인코딩 또는 바이너리가 될 수있는 개인 키 파일을 사용합니다. 이것들은 다양한 확장 기능을 가지고 있으며 패스워드로 보호 될 수도 그렇지 않을 수도 있습니다. 가지고있는 파일에 "----- BEGIN RSA PRIVATE KEY -----"또는 "----- BEGIN PRIVATE KEY -----"라는 헤더 행이있는 경우 실제로는 개인 키입니다 .

마지막으로 Windows는 내부 키 저장소에 개인 키를 저장할 수 있습니다.

개인 키의 위치를 ​​명확히 할 때 질문을 업데이트하십시오.


개인 키가 Java 측에서 사용되는 경우 디지털 서명을 시도 할 수 있습니다. 이 방법으로 (ab)를 사용할 때 테스트 한 여러 자바 공급자가 모두 올바른 결과를 산출하지만 서명을 수행하는 경우 Signature 클래스를 사용해야합니다. C# 코드는 서명 개체를 사용하여 서명을 "확인"해야합니다.

암호화는 개인 키를 사용하여 수행됩니다. 공개 키가 공개이므로 누구나 메시지를 해독 할 수 있습니다. 즉, 메시지는 기밀이 아니다. 공개 키는 수신자가 서명 된 메시지를 확인하는 데 사용됩니다.

+0

인코딩은 Java 측의 개인 키를 사용하여 수행됩니다. 공개 키는 C#에서이 암호를 해독하는 데 사용할 수 있다고 가정합니다. – bkhanal

+0

감사합니다. 그래서 공개 키 (인증서가 아님)를 받았다. 나는 그것을 얻을 수 있다고 생각하지만 코드가 대신 인증서의 키를 전달하고있다. 어디에서 시작해야 할까? :) ... – bkhanal

1

이 코드를 확인하십시오.

public static string Decrypt(string inputText) 
     { 
     RijndaelManaged rijndaelCipher = new RijndaelManaged(); 
     byte[] encryptedData = Convert.FromBase64String(inputText.Replace(" ","+")); 
     PasswordDeriveBytes secretKey = new PasswordDeriveBytes(ENCRYPTION_KEY, SALT); 

     using (ICryptoTransform decryptor = rijndaelCipher.CreateDecryptor(secretKey.GetBytes(32), secretKey.GetBytes(16))) 
     { 
      using (MemoryStream memoryStream = new MemoryStream(encryptedData)) 
      { 
      using (CryptoStream cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read)) 
      { 
       byte[] plainText = new byte[encryptedData.Length]; 
       int decryptedCount = cryptoStream.Read(plainText, 0, plainText.Length); 
       return Encoding.Unicode.GetString(plainText, 0, decryptedCount); 
      } 
      } 
     } 
+0

RijndaelManaged : 나에게 다른 알고리즘처럼 보입니까? – bkhanal