2017-01-25 10 views
2

우리는 다른 회사의 API를 사용하고 있습니다.
해당 API에서 나는 RSACryptoServiceProvider을 사용하여 키 쌍을 생성하고 우리가 데이터를 암호화 할 수 있도록 공개 키를 보내야합니다.RSA - 만 (!) 계수를 사용하여 암호화?

그건 문제가되지 않습니다. API에서 공개 키는 byte[] 유형입니다. 다음

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(1024); 
var pubKey = rsa.ToXmlString(false); //only public 

그리고 byte[]로 대표 :

그래서 내가 좋아하는 일을 생각

var ValuetoSend = Encoding.UTF8.GetBytes(pubKey); 

을 그리고 그 값을 보낼 수 있습니다.

그러나 그들은 응답 :

그래서 궁금했습니다, 그것은 가능 "당신은 단지 RSAKeyInfo 정보를 우리에게 Modulus 속성을 제공해야"? 모듈러스 만 사용하여 데이터를 암호화 할 수 있습니까?

그래서 나는 테스트를 만들었습니다 ( My CodeTheir code을주의하시기 바랍니다)

//My Code 
    byte[] data_clear = UTF8Encoding.UTF8.GetBytes("hellowא"); 
    var rsa = new RSACryptoServiceProvider(1024); 
    var MyModulus = rsa.ExportParameters(true).Modulus; 



    //Their code (I assume , If they only want MyModulus) 
    var rsa2 = new RSACryptoServiceProvider(1024); 
    var rsa2Params = rsa2.ExportParameters(true); 
    rsa2Params.Modulus=MyModulus; //they set their Modulus to MY Modulus 
    byte[] enc_data = rsa2.Encrypt(data_clear, true); 

    // Back to my code 


    var g=Encoding.UTF8.GetString(rsa.Decrypt(enc_data, true)); 
    Console.WriteLine(g); 

이 결과 : 예외 : OAEP 패딩을 디코딩하는 동안

CryptographicException 오류가 발생했습니다.

질문

1) 그것은 그들 만 계수를 사용하여 암호화 할 수 있습니까?

2) 그렇다면 내 테스트에 무엇이 잘못되었으며 어떻게 해결할 수 있습니까?

편집 - 나는 exponenet를 추가하더라도, 그것은 실패

//My Code 
    byte[] data_clear = UTF8Encoding.UTF8.GetBytes("hellowא"); 
    var rsa = new RSACryptoServiceProvider(1024); 
    var MyModulus = rsa.ExportParameters(true).Modulus; 
    var MyExponent = rsa.ExportParameters(true).Exponent; 



    //Their code (I assume , If they only want MyModulus) 
    var rsa2 = new RSACryptoServiceProvider(1024); 
    var rsa2Params = rsa2.ExportParameters(true); 
    rsa2Params.Modulus=MyModulus; //they set their Modulus to MY Modulus 
    rsa2Params.Exponent=MyExponent; //they set their Modulus to MY Modulus 
    byte[] enc_data = rsa2.Encrypt(data_clear, true); 



    // Back to my code 
    var g=Encoding.UTF8.GetString(rsa.Decrypt(enc_data, true)); 
    Console.WriteLine(g); 

    //CryptographicException Error occurred while decoding OAEP padding. 
+0

나는 모듈러스와 지수가 필요하다고 생각한다. 뭔가 여기 꽤 사납게 보인다. –

+0

@EricLippert 안녕하세요 Eric. 지수를 제공하더라도 [실패 함] (https://i.imgur.com/H1uMPRG.jpg) –

+0

Modulus 종류 **는 ** 키의 공개 부분입니다 (개인 키 = 모든 요소는 별도로). 하지만 지수가 없으면 쓸모 없지, 안 그래? –

답변

0

좋아, 여기에 일이다. 구조체이다

var rsa2 = new RSACryptoServiceProvider(2048); 
var rsa2Params = rsa2.ExportParameters(false); 
rsa2Params.Modulus=MyModulus; //they set their Modulus to MY Modulus 

, RSAParameters becuase rsa2 객체에 정말 볼 수 없었다 :

마지막 줄에 새 값을 설정하는 것으로 보인다.

그래서 우리는 rsa2에서 까지 가져 오기 구조가 필요합니다. 또한

rsa2.ImportParameters(rsa2Params); 

- 지수가 반드시 필요하다 :

나는이 라인을 추가했다. 그래서 내가 그들에게 지수를 제공하지 않으면 어떻게 그들 편에서 일할 수 있을까요?음, 이것은 오늘날의 세계 (0x010001)에서 지수의 기본값이기 때문입니다.

enter image description here

0

1) 계수와 지수는 암호화에 필요한 : 그것은 그들이 지금 어쨌든 그것은 모든 일을

를 암호화 할 수 있습니다 이유입니다 그래서. 또한 해독을 위해 해당 개인 키를 찾는 데 사용됩니다.

2) 바이트 배열을 해독 할 수 없도록 RSACryptoServiceProvider에서 개인 키를 설정하지 않았습니다.

+0

2에 대해서는 내 편에있는 개인 키가 존재합니다. 그들의 편에서, 그것은 doesnt한다. 암호화 만하면됩니다. –

+0

개인 키의 내용을 확인하십시오. 올바른 개인 키를 사용하는 경우 개인 키의 모듈러스 및 지수는 공개 키와 동일해야합니다. – anguspcw

+0

그들은 있습니다. 알아. 방금 지수의 기본값을 알지 못했습니다. , 그래서 그들이 어떻게 exp 부분없이 암호화 할 수 있는지 이해하지 못했습니다. –