Calculating pow(a,b) mod n

后端 未结 14 991
执念已碎
执念已碎 2020-11-22 16:25

I want to calculate ab mod n for use in RSA decryption. My code (below) returns incorrect answers. What is wrong with it?

unsigned long i         


        
相关标签:
14条回答
  • 2020-11-22 17:04

    You can try this C++ code. I've used it with 32 and 64-bit integers. I'm sure I got this from SO.

    template <typename T>
    T modpow(T base, T exp, T modulus) {
      base %= modulus;
      T result = 1;
      while (exp > 0) {
        if (exp & 1) result = (result * base) % modulus;
        base = (base * base) % modulus;
        exp >>= 1;
      }
      return result;
    }
    

    You can find this algorithm and related discussion in the literature on p. 244 of

    Schneier, Bruce (1996). Applied Cryptography: Protocols, Algorithms, and Source Code in C, Second Edition (2nd ed.). Wiley. ISBN 978-0-471-11709-4.


    Note that the multiplications result * base and base * base are subject to overflow in this simplified version. If the modulus is more than half the width of T (i.e. more than the square root of the maximum T value), then one should use a suitable modular multiplication algorithm instead - see the answers to Ways to do modulo multiplication with primitive types.

    0 讨论(0)
  • 2020-11-22 17:04

    int's are generally not enough for RSA (unless you are dealing with small simplified examples)

    you need a data type that can store integers up to 2256 (for 256-bit RSA keys) or 2512 for 512-bit keys, etc

    0 讨论(0)
  • 2020-11-22 17:04

    use fast exponentiation maybe..... gives same o(log n) as that template above

        int power(int base, int exp,int mod)
    {
        if(exp == 0)
         return 1;
    
        int p=power(base, exp/2,mod);
        p=(p*p)% mod;
        return (exp%2 == 0)?p:(base * p)%mod;
    }
    
    0 讨论(0)
  • 2020-11-22 17:05

    Usually it's something like this:

    while (b)
    {
        if (b % 2) { res = (res * a) % n; }
    
        a = (a * a) % n;
        b /= 2;
    }
    
    return res;
    
    0 讨论(0)
  • 2020-11-22 17:06

    In order to calculate pow(a,b) % n to be used for RSA decryption, the best algorithm I came across is Primality Testing 1) which is as follows:

     int modulo(int a, int b, int n){
        long long x=1, y=a; 
        while (b > 0) {
            if (b%2 == 1) {
                x = (x*y) % n; // multiplying with base
            }
            y = (y*y) % n; // squaring the base
            b /= 2;
        }
        return x % n;
    }
    

    See below reference for more details.


    1) Primality Testing : Non-deterministic Algorithms – topcoder

    0 讨论(0)
  • 2020-11-22 17:10

    This(encryption) is more of an algorithm design problem than a programming one. The important missing part is familiarity with modern algebra. I suggest that you look for a huge optimizatin in group theory and number theory. If n is a prime number, pow(a,n-1)%n==1 (assuming infinite digit integers).So, basically you need to calculate pow(a,b%(n-1))%n; According to group theory, you can find e such that every other number is equivalent to a power of e modulo n. Therefore the range [1..n-1] can be represented as a permutation on powers of e. Given the algorithm to find e for n and logarithm of a base e, calculations can be significantly simplified. Cryptography needs a tone of math background; I'd rather be off that ground without enough background.

    0 讨论(0)
提交回复
热议问题