2010-05-26 2 views
5

나는 노력했지만 시도했지만 "나쁜 데이터"가 계속됩니다. RSACryptoServiceProvider를 사용하여 공개 키의 지수/모듈을 사용하여 데이터를 어떻게 해독합니까? 마이크로 소프트 구현 부분과 버그가C# RSA 공용 계수/지수? (불량 데이터)

http://www.codeproject.com/KB/cs/biginteger.aspx

때문에 :

public byte[] PublicDecryption(byte[] encryptedData) 
{ 
     var encData = new BigInteger(encryptedData); 
     BigInteger bnData = encData.modPow(_exponent, _modulus); 
     return bnData.getBytes(); 
} 

public byte[] PrivateDecryption(byte[] encryptedData) 
{ 
    var encData = new BigInteger(encryptedData); 
    d = new BigInteger(rsaParams.D); 
    BigInteger bnData = encData.modPow(d, _modulus); 
    return bnData.getBytes(); 
} 

의 BigInteger은 이것이다 :

public static byte[] Encrypt(byte[] b, byte[] mod, byte[] exp) 
{ 
    CspParameters csp = new CspParameters(); 
    RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(csp); 
    RSACryptoServiceProvider.UseMachineKeyStore = false; 

    RSAParameters par = new RSAParameters(); 
    par.Exponent = exp; 
    par.Modulus = mod; 
    rsa.ImportParameters(par); 

    return rsa.Encrypt(b, false); 
} 
public static byte[] Decrypt(byte[] b, byte[] pubexp, byte[] mod, byte[] priexp) 
{ 
    RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); 
    RSACryptoServiceProvider.UseMachineKeyStore = false; 
    RSAParameters rp = new RSAParameters(); 

    rp.Exponent = pubexp; 
    rp.D = priexp; 

    rp.Modulus = mod; 
    rsa.ImportParameters(rp); 
    return rsa.Decrypt(b, false); 
} 

static List<byte[]> Base2Array(string str) 
{ 
    byte[] b = Convert.FromBase64String(str); 

    List<byte[]> Bytes = new List<byte[]>(); 

    int i = 0; 
    while (i < b.Length) 
    { 
     int size = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(b, i)); 
     i += 4; 
     byte[] b2 = new byte[size]; 
     Array.Copy(b, i, b2, 0, size); 
     Bytes.Add(b2); 
     i += size; 
    } 

    return Bytes; 
} 


static void Main(string[] args) 
{ 
    List<byte[]> pub = Base2Array("AAAAB3NzaC1yc2EAAAABJQAAAIBMW4HxU1glv+CcZpJnvUKEyeNfFoKkyLOVLOOb/vNXQkrkGsNdpYAZkKKizij8fD3u3/iYT8UI+xkFoyonRYVipgCslirJB1VdvLivXs69Ht4vf7VAv2yJSUni3XsIHauMlfOkjJ7DpUW75ZkrxsGieICFWlXvRnAyDdqQrkZRZQ=="); 
    List<byte[]> pri = Base2Array("AAAAgBSjHDNiojO3UXZg6Ux4VyrOx9SCn9mCWgykWTEUeR6Anp6DxhlPUw3UEEetVy97hlw8iGCEQxcvG4T7qocni9UtUTLdpuQzvr6718y2CP0ouKt/1hVKD9QssT08XUvJEBQnnl2yVZAbIqT/DGnUH36L0BnQE/2ombPakwHscfFFAAAAQQCSfQy2cP8Oa0IR0u0whxqGmuuXY/3tCD8NaaSCYm31ly0QBdxFdf2WkC51DNVaf5/1ErHceMapFN9Z3j+/6lA7AAAAQQCFcMoSA32f240nFBmMv/nn/mL1uSdAXOxjUHViJc6M8ntZvW2ZuP2qTvfA3mh1AK5K69piX/4T72xxqTA2tmrfAAAAQFxX1JunFI+fpobdienVCZcjibwbpDPf1MVTbwQhAXHqVBL3XXgkysS/67X/aWnv/+SdBDaXa1SnDpphSWOkxAQ="); 

    //pub[0] 7 
    //pub[1] 1 
    //pub[2] 128 

    //pri[0] 128 
    //pri[1] 65 
    //pri[2] 65 
    //pri[3] 64 

    byte[] pubmod = null; 
    byte[] primod = null; 
    byte[] pubexp = null; 
    byte[] priexp = null; 

    pubexp = pub[0]; 
    pubmod = pub[2]; 

    priexp = pri[0]; 
    primod = pri[2]; 


    byte[] bstr = Encoding.ASCII.GetBytes("Test"); 

    bstr = Encrypt(bstr, pubmod, pubexp); 
    bstr = Decrypt(bstr, pubexp, pubmod, null); 


    string str = Encoding.ASCII.GetString(bstr); 
} 
+0

정보가 충분하지 않습니다 .... –

+0

작동하지 않는 코드가 추가되었습니다. – user230821

+0

microsofts RSA 클래스는 매우 기본적이고 형식으로 된 키만 허용한다고합니다. 오 잘, 다운로드 한 탄력성 및 그것을 파악하는 것을 시도하고있다. – user230821

답변

2

는 내가 그런 일을한다.

나는 이것에 문제가 없었습니다.

희망 I는 개인 키 암호화 및 공개 키 암호 해독 시나리오를 구현하기 위해 노력했다

1

몇 달 전에이 도움이됩니다. 나는 일주일에 RSACryptoServiceProvider과 아무것도하지 않으려 고 노력했다. 두 가지 사용 사례 만 지원합니다.

  1. 공개 키 암호화, 개인 (전체) 키 암호 해독.

  2. 공개 키로 서명하여 개인 키로 서명.

그리고 그들은 API로 다른 일을 할 수 없도록 모든 것을했습니다. msdn 포럼을 확인하십시오. 지원 개발팀의 답변을 포함하여 msdn과 같은 여러 답변을 발견했습니다. 그들이 말한 모든 것 : 이것은 의도적으로 금지되어 있습니다. 그래서 제 제안은 심지어 RSACryptoServiceProvider으로하려고하지도 않으며 다른 구현을 더 잘 사용하십시오.