2017-09-13 1 views
0

私はこれを小さな番号にも対応できます。大きな数字でも暗号化はうまくいきます。ただし、復号化装置には問題があります。誰かが私を助けることができますか?128bits-C++用のRSAユニットの実装

main() 
{ 
    //__uint128_t secret=((__uint128_t)3502532219136638976) <<64 |1161929539123609600; 
    //__uint128_t pvtkey=((__uint128_t)14605469131018042215) <<64 |1281687108645159073; 
    //__uint128_t n=((__uint128_t)16156614574048939703) <<64| 17372945349702060311; 

    decrypt(1434,1293,2491); 
} 




__uint128_t decrypt(__uint128_t secret,__uint128_t pvtkey,__uint128_t n) 
{ 
    cout<< "Decrypting..."<<"\n"; 


    __uint128_t imsg_copy2=pvtkey; 
    uint64_t imsg64_lo2,imsg64_hi2; 
    imsg64_lo2=imsg_copy2; 
    imsg_copy2=imsg_copy2>>64; 
    imsg64_hi2=imsg_copy2; 
    cout << "Pvt key recvd here:"<<imsg64_lo2<<"\n"; 
    cout << "Pvt key recvd here hi:"<<imsg64_hi2<<"\n"; 
    __uint128_t r=1; 
    int ctr=0; 
    while(1) 
    { 
     if(((__uint128_t)pvtkey)%2==1) 
      {r=(((__uint128_t)r)*((__uint128_t)secret))%((__uint128_t)n); 
      cout<<" r:" << r << "\n" ; 
      } 
    //  cout <<"Dividing"; 
     pvtkey=((__uint128_t)pvtkey)/2; 
     cout << "r:"; 
     printf_128(r); 
     cout << ctr << "\n"; 

     if(pvtkey==0) 
      break; 
     cout<<"secret:"; 
     secret=(((__uint128_t)secret)*((__uint128_t)secret)%((__uint128_t)n)); 
     printf_128(secret); 
     ctr++; 

     cout << "Decryption inside function_lo:"<<"\n"; 
     printf_128(r); 
     return ((__uint128_t)r); 
    } 


void printf_128(__uint128_t v) 
{ 

       __uint128_t imsg_copy=v; 
       uint64_t imsg64_lo,imsg64_hi; 
       imsg64_lo=imsg_copy; 
       imsg_copy=imsg_copy>>64; 
       imsg64_hi=imsg_copy; 
       cout <<imsg64_hi<<imsg64_lo<<"\n"; 

    } 

したがって、この関数を小さい数値に実行すると、復号化ユニットが正常に動作します。しかし、大規模な公開鍵でこれを行うと、すべての値が0に設定されます。誰かを助けることができますか?

+1

すべての値は0に設定されますか?それはいくつかのブレークポイントで追跡するのが本当に簡単です。 –

+3

これらの(__uint128_t)キャストの大半は、すべてではないにせよ、不要で混乱しているようです。 –

答えて

0

コードに128ビットの数値を与える2つの128ビットの数値を乗算しますが、完全な結果(256ビットの数値)が必要で、結果のmod nを計算する必要があります。

関連する問題