Test Problem Generation - Public Key \302\251Mike May, S.J 2007, maymk@slu.edu A problem for teachers is to construct problems in cryptography that the student can solve with the appropriate level of technology. This worksheet looks at constructing problems that students can solve with Maple and an appropriate method, but where they will have difficulty if they do not use the suggested method. restart:
<Text-field style="Heading 1" layout="Heading 1">Generation of prime for use with Pohlig-Helman</Text-field> The idea is to generate a prime p such that p-1 factors into a product of small primes. The technique is to look for a value q that is a product of small primes and then check values of the form kq+1 intil a prime is found. q := 3^5*5^4*7^4*11; IitEMTw2Uw== k := 1: p:= 2*k*q+1: test := isprime(p): while not(test) do k:= k+1: p:= 2*k*q+1: test := isprime(p): end do: "The prime found " = p; "The factor k " = k; "The factorization of p "= ifactor(p-1); L1ExVGhlfnByaW1lfmZvdW5kfjYiIixeNzIsQSg= L1EuVGhlfmZhY3Rvcn5rfjYiIiIq L1E4VGhlfmZhY3Rvcml6YXRpb25+b2Z+cH42IiosLUkhR0YkNiMiIiMiIiIpLUYnNiMiIiQiIihGKiktRic2IyIiJiIiJUYqKS1GJzYjRi9GNEYqLUYnNiMiIzZGKg== We also want to check generators by looking at candidates raised to powers (p-1)/q for the factors of p-1. We run through a number of candidates for a generator and print out the generators. gentest := x -> (Power(x,(p-1)/2) mod p, Power(x,(p-1)/5) mod p, Power(x,(p-1)/3) mod p, Power(x,(p-1)/7) mod p, Power(x,(p-1)/11) mod p): for i from 2 to 50 do test := min(gentest(i)): if (test > 1) then print([i, gentest(i)]) end if; end do: NygiIiMiLF03MixBKCIrQGtyVCEqIiw7ISo+eVslIixsaGhgRCIiLDd4MiRHag== NygiIigiLF03MixBKCIrQGtyVCEqIixNQShHS0YiLGU5L1A/IiIsKilHISpIJW8= NygiIzYiLF03MixBKCIsOyRSdnNNIiw7ISo+eVslIixsaGhgRCIiLEpvIlJyUA== NygiIzciLF03MixBKCIrQGtyVCEqIixNQShHS0YiLF8oWycpUlwiLClcZFtuPA== NygiIzoiLF03MixBKCIsNkxzWD4kIixNQShHS0YiLD9JeGpHIiIsKVxkW248 NygiIz0iLF03MixBKCIsNkxzWD4kIiw7ISo+eVslIixfKFsnKVJcIixKbyJSclA= NygiI04iLF03MixBKCIrQGtyVCEqIiw7ISo+eVslIixfKFsnKVJcIitlUGdhKSo= NygiI1MiLF03MixBKCIsYE07KG9vIixNQShHS0YiLGxoaGBEIiIsTFslPlRt NygiI1oiLF03MixBKCIsOyRSdnNNIiw7ISo+eVslIiw8cy4kKTQjIixCPkxTInA= NygiI1siLF03MixBKCIsYE07KG9vIiw7ISo+eVslIixlOS9QPyIiLDd4MiRHag== NygiI10iLF03MixBKCIrQGtyVCEqIixNQShHS0YiLCopZS1tbCQiLExbJT5UbQ==
<Text-field style="Heading 2" layout="Heading 2"></Text-field> with(numtheory); N1FJJkdJZ2NkRzYiSSliaWdvbWVnYUdGJEkmY2ZyYWNHRiRJKWNmcmFjcG9sR0YkSStjeWNsb3RvbWljR0YkSSlkaXZpc29yc0dGJEkpZmFjdG9yRVFHRiRJKmZhY3RvcnNldEdGJEknZmVybWF0R0YkSSlpbWFndW5pdEdGJEkmaW5kZXhHRiRJL2ludGVncmFsX2Jhc2lzR0YkSSlpbnZjZnJhY0dGJEknaW52cGhpR0YkSSppc3NxcmZyZWVHRiRJJ2phY29iaUdGJEkqa3JvbmVja2VyR0YkSSdsYW1iZGFHRiRJKWxlZ2VuZHJlR0YkSSltY29tYmluZUdGJEkpbWVyc2VubmVHRiRJKG1pZ2NkZXhHRiRJKm1pbmtvd3NraUdGJEkobWlwb2x5c0dGJEklbWxvZ0dGJEknbW9iaXVzR0YkSSZtcm9vdEdGJEkmbXNxcnRHRiRJKW5lYXJlc3RwR0YkSSpudGhjb252ZXJHRiRJKW50aGRlbm9tR0YkSSludGhudW1lckdGJEknbnRocG93R0YkSSZvcmRlckclKnByb3RlY3RlZEdJKXBkZXhwYW5kR0YkSSRwaGlHRiRJI3BpR0YkSSpwcHJpbXJvb3RHRiRJKXByaW1yb290R0YkSShxdWFkcmVzR0YkSStyb290c3VuaXR5R0YkSSpzYWZlcHJpbWVHRiRJJnNpZ21hR0YkSSpzcTJmYWN0b3JHRiRJKHN1bTJzcXJHRiRJJHRhdUdGJEkldGh1ZUdGJA== x := mlog(2,7,p); IitUVG1zXw== showstat(mlog); numtheory:-mlog := proc(x, a, n, phh) local aa, fn, g, i, j, k, phin, powa, xx, s, orbit; 1 if nargs < 3 or 4 < nargs or nargs = 4 and not type(phh,name) then 2 error "invalid arguments" end if; 3 if not (type(x,rational) and type(a,integer) and type(n,integer)) then 4 return ('procname')(args) end if; 5 xx := modp(x,n); 6 aa := modp(a,n); 7 if aa = 0 then 8 if xx = 0 then 9 if nargs = 4 then 10 phh := 1 end if; 11 return 1 end if; 12 return FAIL end if; 13 g := igcd(aa,n); 14 if xx = 0 or igcd(xx,g) <> 1 then 15 powa := aa; 16 for i do 17 if powa = xx then 18 if nargs = 4 then 19 orbit := {xx}; 20 for k while not member(`mod`(aa^(i+k),n),orbit) do 21 orbit := `union`(orbit,{`mod`(aa^(i+k),n)}) end do; 22 if `mod`(aa^(i+k),n) = x then 23 phh := k else 24 phh := 0 end if end if; 25 return i end if; 26 if igcd(aa,n/igcd(powa,n)) = 1 then 27 break end if; 28 powa := modp(powa*aa,n) end do; 29 g := igcd(powa,n); 30 if xx = 0 or irem(xx,g) <> 0 then 31 return FAIL end if; 32 j := numtheory:-mlog(modp(xx,n/g),aa,n/g,'phin'); 33 if j = FAIL then 34 return FAIL end if; 35 while j < i do 36 j := j+phin end do; 37 if nargs = 4 then 38 phh := phin end if; 39 return j end if; 40 if g <> 1 then 41 while igcd(aa,n/g) <> 1 do 42 g := igcd(g^2,n) end do; 43 j := numtheory:-mlog(xx,aa,n/g,'phin'); 44 if modp(('power')(aa,j)-xx,n) <> 0 then 45 return FAIL end if; 46 if nargs = 4 then 47 phh := phin end if; 48 return j end if; 49 phin := numtheory:-mlogb(aa,n); 50 if nargs = 4 then 51 phh := phin end if; 52 if xx = aa then 53 return 1 end if; 54 if xx = 1 then 55 return 0 end if; 56 if phin <= 100 then 57 powa := aa; 58 for i from 2 to phin do 59 powa := modp(powa*aa,n); 60 if powa = xx then 61 return i end if end do; 62 return FAIL end if; 63 if isprime(n) then 64 xx := numtheory:-_mlogprime(xx,n); 65 aa := numtheory:-_mlogprime(aa,n); 66 s := traperror(modp(xx/aa,(n-1)/igcd(xx,aa,n-1))); 67 if s = lasterror then 68 return FAIL end if; 69 return s end if; 70 fn := ifactor(n); 71 if type(fn,`*`) then 72 return mlogcomposite(xx,aa,fn) end if; 73 return mlogpower(xx,aa,fn) end proc showstat(numtheory::_mlogsolve); numtheory:-_mlogsolve := proc(a, b, k, n) local as, i, prod, s, T, _mlogTAB; 1 if b = 1 then 2 return 0 end if; 3 if a = b then 4 return 1 end if; 5 if k = 3 then 6 return 2 end if; 7 if not assigned(_mlogTAB[n][a]) then 8 s := isqrt(3*k); 9 as := modp(('power')(a,s),n); 10 _mlogTAB[n][a] := table(); 11 T := eval(_mlogTAB[n][a]); 12 prod := 1; 13 for i from s by s to k+s-1 do 14 prod := modp(as*prod,n); 15 T[prod] := i end do end if; 16 T := eval(_mlogTAB[n][a]); 17 prod := b; 18 for i from 0 do 19 if assigned(T[prod]) then 20 return T[prod]-i else 21 prod := modp(prod*a,n) end if end do end proc
This gives a prime and a generator where the prime is to large to check.
<Text-field style="Heading 1" layout="Heading 1">Carmichael numbers</Text-field> Carmichael numers are useful as exampels with some primlity tests. In particular, a Carmichael numer is likely to be factorable with the Miller-Rabin method. k:= nextprime(rand(10^20)()); test := isprime(6*k+1) and isprime(12*k+1) and isprime(18*k+1); while (not(test)) do k:= nextprime(k): test := isprime(6*k+1) and isprime(12*k+1) and isprime(18*k+1): end do: k; n := (6*k+1)*(12*k+1)*(18*k+1); IjVcMSFcT0BmMydHdw== SSZmYWxzZUclKnByb3RlY3RlZEc= IjUsajJsOCNmMydHdw== ImpuSER6Sl5ZPyQ9ITRHOVx0LU40UjYua0VhRV8iPXR3aGBk n; ImpuSER6Sl5ZPyQ9ITRHOVx0LU40UjYua0VhRV8iPXR3aGBk k := n-1; s := 0: while (irem(k,2)= 0) do s := s+1: k := k/2: end do: 's' =s; 'k' = k; n-k*2^s; ImpuR0R6Sl5ZPyQ9ITRHOVx0LU40UjYua0VhRV8iPXR3aGBk L0kic0c2IiIiJQ== L0kia0c2IiJpbkxxdHEhSF1ramJVQCQ0I1JNJD5ZPl07KmU7WFFkLzZnZiQ= IiIi test := Power(6,k) mod n; ImluXUF5UVFOQShHY18zdyhSblZFREszKkgsaFRtaW83M2om for i from 2 to 15 do test := Power(i,k) mod n; p1 := igcd(test-1,n): if ((p1 > 1) and (n>p1)) then n1 := n/p1: print([i, p1, n1]): end if: end do: NyUiIiMiNjJ5WCE+R2JeO3hYIkxaM0hdQF5oUiQ+IVsiKilINE9fXmstZDc= NyUiIiUiS0xAJDNPW1N2VHYzZSVcWSE9d0RLXkcnIjY4YyI0UWM1LkxhIio= NyUiIiYiNz5NUHJYZVkmXEpQIiJLInBTU0kzN01MNEBzSFZPWDw8KTMhPiU= NyUiIiciNz5NUHJYZVkmXEpQIiJLInBTU0kzN01MNEBzSFZPWDw8KTMhPiU= NyUiIikiNjJ5WCE+R2JeO3hYIkxaM0hdQF5oUiQ+IVsiKilINE9fXmstZDc= NyUiIzYiNz5NUHJYZVkmXEpQIiJLInBTU0kzN01MNEBzSFZPWDw8KTMhPiU= NyUiIzciNjhjIjRRYzUuTGEiKiJLTEAkM09bU3ZUdjNlJVxZIT13REteRyc= NyUiIzgiNz5NUHJYZVkmXEpQIiJLInBTU0kzN01MNEBzSFZPWDw8KTMhPiU= NyUiIzkiNz5NUHJYZVkmXEpQIiJLInBTU0kzN01MNEBzSFZPWDw8KTMhPiU= NyUiIzoiNjJ5WCE+R2JeO3hYIkxaM0hdQF5oUiQ+IVsiKilINE9fXmstZDc= ifactor(n,lenstra); Warning, computation interrupted
<Text-field style="Heading 1" layout="Heading 1">Quadratic Sieve problems</Text-field> We would like to have nice numbers to test factoring with a quadratic sieve. We first want to collect a set of primes of the appropriate size, then multiply two of them together as a candidate n. We then see if the method produces a factorization/ p1 := nextprime(rand(10^4)()); p2 := nextprime(rand(2*10^4)()); p3 := nextprime(rand(5*10^4)()); p4 := nextprime(rand(3*10^4)()); IiU+Uw== IiZSaCI= IiZGXCU= IiVySw== n := p4*p1; sqrtn := isqrt(n); sqrt2n := isqrt(2*n); TestRange := floor((sqrt2n-sqrtn)/2); IilcaDk4 IiVFTw== IiVHXg== IiReKA== The first method is to look at numbers just bigger than sqrt(n*i) for a reasonable value of i. smallprime := 2*3*5*7*11*13*17*19; for i from 1 to 200 do t1 := ceil(sqrt(n*i)): t2 := t1^2 mod n: t3 := irem(smallprime^10, t2): if (t3 = 0) then print(i, t1, t2, ifactors(t2)) fi; end do: IighcCpwKg== NiYiI0QiJkgiPSIlO3A3JCIiIjcmNyQiIiNGKjckIiIoRic3JCIjOEYnNyQiIz5GJw== NiYiI0UiJilbPSIlcWk3JCIiIjcnNyQiIiNGJzckIiIkRic3JCIiJkYnNyQiIzZGJzckIiM+Ric= NiYiI3IiJl8wJCImRCJbNyQiIiI3JTckIiImIiIlNyQiIihGJzckIiM2Ric= NiYiIyoqIiZ3ZyQiJUQhKjckIiIiNyQ3JCIiJiIiIzckIiM+Ris= NiYiJCsiIiZlaSQiJmt3IzckIiIiNyY3JCIiIyIiJTckIiIoRic3JCIjOEYnNyQiIz5GJw== NiYiJC8iIiZ3cCQiJiEzRDckIiIiNyc3JCIiIyIiJDckRitGJzckIiImRic3JCIjNkYnNyQiIz5GJw== NiYiJHAiIiZOciUiJVchKjckIiIiNyY3JCIiI0YqNyQiIihGJzckIiM8Ric3JCIjPkYn This gives us some candidates. igcd(64430-2*9*7,n); igcd(96645-3^3*7,n); IiU+Uw== IiU+Uw== The second method looks at numers where we mod using a^2-n smallPrimeProd := product(ithprime(j), `j`=1..20); smallPrimeSet := {seq(ithprime(i), i=1..20)}; expVectorMaker := proc(n, m) local smallPrimeTable, expVector, smallPrimeProd, i, capPrime, facList, count, pFactor: smallPrimeTable := table([seq(ithprime(i)=i+1,i=1..m)]): expVector := [seq(0, i=1..m+1)]: capPrime := ithprime(m+1): facList := ifactors(n): if (op(1,facList) = -1) then expVector[1] := 1 end if: count := nops(op(2,facList)): for i from 1 to count do pFactor := op([2,i,1],facList): if (pFactor < capPrime) then expVector[smallPrimeTable[pFactor]] := op([2,i,2],facList) end if: end do: expVector; end proc: IjwhUjp1JzQnKilwRSwkMyV6Yg== PDYiIiMiIiQiIiYiIigiIzYiIzgiIzwiIz4iI0IiI0giI0oiI1AiI1QiI1YiI1oiI2AiI2YiI2giI24iI3I= n:= p2*p3; sqrtn := isqrt(n); sqrt2n := isqrt(2*n); IipgbzJEKA== IiZGcCM= IiYiM1E= primeVector := [-1, seq(ithprime(i), i=1..20)]; goodLines := {}: for i from 1 to sqrt2n do temp := i^2 - n: factorSet := numtheory[factorset](temp): if (factorSet subset smallPrimeSet) then V1 := ifactor(temp): V2 := map(irem,expVectorMaker(temp, 20),2): V3 := {(op(zip((x,y) -> x*y, primeVector, V2)))}: goodLines:= goodLines union {[i, V1, V2, V3]}: end if: end do: goodLines := [op(goodLines)]: goodLines := sort(goodLines,(x,y)-> max(op(x[4]))<max(op(y[4]))): nLines := linalg[vectdim](goodLines): for i from 1 to nLines do print(goodLines[i,1], goodLines[i,2], goodLines[i,4]); end do; NzchIiIiIiMiIiQiIiYiIigiIzYiIzgiIzwiIz4iI0IiI0giI0oiI1AiI1QiI1YiI1oiI2AiI2YiI2giI24iI3I= NiUiJSZHKCwkKiwpLUkhRzYiNiMiIiNGKyIiIiktRig2IyIiJEYrRiwtRig2IyIiKEYsKS1GKDYjIiNCRitGLCktRig2IyIjckYrRiwhIiI8JUY8IiIhRjM= NiUiJkZwIywkKiopLUkhRzYiNiMiIiNGKyIiIi1GKDYjIiIkRiwpLUYoNiMiIihGK0YsLUYoNiMiI0JGLCEiIjwmRjciIiFGL0Y2 NiUiJil5QiwkKiotSSFHNiI2IyIiJCIiIiktRic2IyIiKCIiJUYrLUYnNiMiI0JGKyktRic2IyIjSiIiI0YrISIiPCZGOSIiIUYqRjM= NiUiJSJHJiwkKiopLUkhRzYiNiMiIiNGKyIiIi1GKDYjIiIkRiwtRig2IyIjSkYsKS1GKDYjIiNQIiIlRiwhIiI8JkY4IiIhRi9GMg== NiUiJEAiLCQqLCktSSFHNiI2IyIiI0YrIiIiKS1GKDYjIiIkRjBGLCktRig2IyIiKEYwRiwpLUYoNiMiI0JGK0YsLUYoNiMiI1BGLCEiIjwnRjwiIiFGMEY0Rjs= NiUiJjowJCouKS1JIUc2IjYjIiIjRioiIiIpLUYnNiMiIiRGKkYrLUYnNiMiIihGKy1GJzYjIiNCRispLUYnNiMiI0pGKkYrLUYnNiMiI1BGKzwmIiIhRjJGNUY8 NiUiJVxaLCQqKCktSSFHNiI2IyIiI0YrIiIiKS1GKDYjIiNWIiIkRiwpLUYoNiMiI1pGK0YsISIiPCVGNiIiIUYw NiUiJjFpIywkKiwtSSFHNiI2IyIiJCIiIi1GJzYjIiIoRistRic2IyIjSkYrKS1GJzYjIiNQIiIjRistRic2IyIjVkYrISIiPChGOiIiIUYqRi5GMUY5 NiUiJlJoJCouKS1JIUc2IjYjIiIjRioiIiIpLUYnNiMiIiQiIiVGKyktRic2IyIiKEYqRistRic2IyIjQkYrLUYnNiMiI1BGKy1GJzYjIiNWRis8JiIiIUY3RjpGPQ== NiUiJlZJJCosKS1JIUc2IjYjIiIjRioiIiIpLUYnNiMiIiRGKkYrLUYnNiMiI1ZGKy1GJzYjIiNaRispLUYnNiMiI3JGKkYrPCUiIiFGMkY1 NiUiJjw6IiwkKiwpLUkhRzYiNiMiIiNGKyIiIi1GKDYjIiIoRiwpLUYoNiMiI0IiIiRGLC1GKDYjIiNQRiwtRig2IyIjWkYsISIiPChGOyIiIUYvRjNGN0Y6 NiUiJnVxIyosLUkhRzYiNiMiIiQiIiIpLUYmNiMiIigiIiNGKi1GJjYjIiNKRiotRiY2IyIjUEYqLUYmNiMiI1pGKjwnIiIhRilGMkY1Rjg= NiUiJngkSCouKS1JIUc2IjYjIiIjRioiIiItRic2IyIiJEYrKS1GJzYjIiIoRi5GKy1GJzYjIiNCRistRic2IyIjSkYrLUYnNiMiI1pGKzwoIiIhRi5GMkY1RjhGOw== NiUiJjMzIiwkKiotSSFHNiI2IyIiJCIiIiktRic2IyIjSiIiI0YrLUYnNiMiI1pGKyktRic2IyIjbkYwRishIiI8JkY4IiIhRipGMw== NiUiJk5vIywkKiwpLUkhRzYiNiMiIiNGKyIiIi1GKDYjIiNCRiwtRig2IyIjSkYsLUYoNiMiI1BGLC1GKDYjIiNaRiwhIiI8KEY5IiIhRi9GMkY1Rjg= NiUiJi9HJCoqLUkhRzYiNiMiIiQiIiIpLUYmNiMiIigiIiNGKi1GJjYjIiNCRiopLUYmNiMiI1pGKUYqPCYiIiFGKUYyRjY= NiUiJkxwIyoqKS1JIUc2IjYjIiIjRioiIiIpLUYnNiMiIiRGL0YrLUYnNiMiI1pGKy1GJzYjIiNoRis8JiIiIUYvRjJGNQ== NiUiJkgiSCouKS1JIUc2IjYjIiIjRioiIiIpLUYnNiMiIiRGKkYrKS1GJzYjIiIoRipGKy1GJzYjIiNKRistRic2IyIjUEYrLUYnNiMiI2hGKzwmIiIhRjZGOUY8 NiUiJjJeJCouKS1JIUc2IjYjIiIjRioiIiItRic2IyIiJEYrKS1GJzYjIiIoRi5GKy1GJzYjIiNWRistRic2IyIjWkYrLUYnNiMiI2hGKzwoIiIhRi5GMkY1RjhGOw== NiUiJmdeIiwkKiwpLUkhRzYiNiMiIiQiIiciIiItRig2IyIiKEYtLUYoNiMiI1BGLS1GKDYjIiNWRi0tRig2IyIjaEYtISIiPChGOiIiIUYwRjNGNkY5 NiUiJVolKSwkKi4pLUkhRzYiNiMiIiNGKyIiIiktRig2IyIiJEYrRiwtRig2IyIiKEYsLUYoNiMiI0JGLCktRig2IyIjVkYrRiwtRig2IyIjaEYsISIiPCdGPiIiIUYzRjZGPQ== NiUiJnRZIywkKi4pLUkhRzYiNiMiIiNGKyIiIiktRig2IyIiJEYrRiwpLUYoNiMiIihGK0YsLUYoNiMiI0JGLC1GKDYjIiNaRiwtRig2IyIjaEYsISIiPCdGPiIiIUY3RjpGPQ== NiUiJlFzIyosKS1JIUc2IjYjIiIkIiIjIiIiLUYnNiMiI0JGLC1GJzYjIiNKRiwtRic2IyIjVkYsLUYnNiMiI2hGLDwnIiIhRi9GMkY1Rjg= NiUiJkBOJCouKS1JIUc2IjYjIiIjRioiIiIpLUYnNiMiIiQiIiVGKy1GJzYjIiIoRistRic2IyIjVkYrLUYnNiMiI2hGKy1GJzYjIiNuRis8JyIiIUYzRjZGOUY8 NiUiJlVnIywkKiopLUkhRzYiNiMiIiRGKyIiIiktRig2IyIiKCIiI0YsKS1GKDYjIiNCRjFGLC1GKDYjIiNuRiwhIiI8JkY5IiIhRitGOA== NiUiJjg9IiwkKiopLUkhRzYiNiMiIiNGKyIiIiktRig2IyIiJCIjNUYsLUYoNiMiI1BGLC1GKDYjIiNuRiwhIiI8JkY4IiIhRjRGNw== NiUiJnFLIywkKi4pLUkhRzYiNiMiIiQiIiMiIiItRig2IyIiKEYtLUYoNiMiI0JGLS1GKDYjIiNKRi0tRig2IyIjaEYtLUYoNiMiI25GLSEiIjwpRj0iIiFGMEYzRjZGOUY8 NiUiJnRzJCouKS1JIUc2IjYjIiIjRioiIiIpLUYnNiMiIiQiIiZGKy1GJzYjIiIoRistRic2IyIjSkYrLUYnNiMiI1pGKy1GJzYjIiNuRis8KCIiIUYvRjNGNkY5Rjw= NiUiJl55IyosKS1JIUc2IjYjIiIjRioiIiIpLUYnNiMiIiQiIidGKy1GJzYjIiIoRistRic2IyIjUEYrLUYnNiMiI25GKzwmIiIhRjNGNkY5 NiUiJnZEIiwkKi4pLUkhRzYiNiMiIiNGKyIiIi1GKDYjIiIkRiwpLUYoNiMiI0JGK0YsLUYoNiMiI0pGLC1GKDYjIiNWRiwtRig2IyIjbkYsISIiPChGPSIiIUYvRjZGOUY8 NiUiJiEpcCMqLC1JIUc2IjYjIiIkIiIiLUYmNiMiIihGKi1GJjYjIiNWRiotRiY2IyIjWkYqLUYmNiMiI25GKjwoIiIhRilGLUYwRjNGNg== NiUiJlx1IyosKS1JIUc2IjYjIiIjRioiIiItRic2IyIiJEYrLUYnNiMiIihGKy1GJzYjIiNuRispLUYnNiMiI3JGKkYrPCYiIiFGLkYxRjQ= NiUiJkJxIyosKS1JIUc2IjYjIiIjRioiIiIpLUYnNiMiIiRGKkYrLUYnNiMiI1ZGKy1GJzYjIiNaRistRic2IyIjckYrPCYiIiFGMkY1Rjg= NiUiJml3IyoqKS1JIUc2IjYjIiIkRioiIiIpLUYnNiMiIihGKkYrLUYnNiMiI2hGKy1GJzYjIiNyRis8JyIiIUYqRi9GMkY1 NiUiJjtlIywkKiopLUkhRzYiNiMiIiQiIiMiIiIpLUYoNiMiI1BGLEYtLUYoNiMiI25GLS1GKDYjIiNyRi0hIiI8JkY4IiIhRjRGNw== NiUiJGElLCQqLiktSSFHNiI2IyIiJCIiIyIiIi1GKDYjIiNCRi0tRig2IyIjSkYtLUYoNiMiI1BGLS1GKDYjIiNWRi0tRig2IyIjckYtISIiPClGPSIiIUYwRjNGNkY5Rjw= NiUiJmotIywkKiwpLUkhRzYiNiMiIiNGKyIiIiktRig2IyIiJCIiJ0YsKS1GKDYjIiIoRitGLC1GKDYjIiNKRiwtRig2IyIjckYsISIiPCZGPCIiIUY4Rjs= NiUiJlZVIiwkKi4pLUkhRzYiNiMiIiNGKyIiIiktRig2IyIiJCIiJkYsLUYoNiMiIihGLC1GKDYjIiNCRiwtRig2IyIjWkYsLUYoNiMiI3JGLCEiIjwpRj4iIiFGMEY0RjdGOkY9 NiUiJlBwIyooKS1JIUc2IjYjIiIjRioiIiIpLUYnNiMiI1ZGKkYrLUYnNiMiI3JGKzwkIiIhRjI= This gives a pair of lines that produces a factorization igcd(26927*23788-2*3*7^3*23*31,n); IiZSaCI=
<Text-field style="Heading 1" layout="Heading 1">RSA generation</Text-field> p := nextprime(rand(10^60)()); q := nextprime(rand(10^60)()); ImduIlwqKnpALiVlJWVkJ28hKVFaSTAiPk1oJipwPmtoWydbJip6aQ== ImduZiVbLydbJSpmPmtwO21QKj5UOyI+S2NGSj8sUmJmKlwvKQ== n := p*q; n1 := (p-1)*(q-1); e := 2^16+1; d := 1/e mod n1; ImNycFZ0JDQybyIqKUheQSYpbzwvdiNld0Y1I3krQTI+eiNwSm5nb2k7K0ZAM1gzVTJfSi1sLHVJKlEjPlcleVs2QV9d ImNyP2tHOiFmJSlcKSplciRRIzQ8YytbPy5SKlxRLyMpKTR4PipIMCdvaTsrRkAzWDNVMl9KLWwsdUkqUSM+VyV5WzZBX10= IiZQYic= ImNyOGJJLGZkckBWZilSIyl5YCNlLWtwSi43Qjk1XmtWeGZ3XUNFJ0dzKm8qXCNRazladDRtOk1nbEg/bzk0WWhCUw== m := 23; c := Power(m,e) mod n; m1 := Power(c,d) mod n; IiNC ImNySFQjemUxXD0ocHNNI1JSd0t2bXRuaVVUJiopZT8iPlxoLTBRWW5IbSV5OykzLnMlUnJ6JypvdypbOmdrXFhoamBdJA== IiNC
<Text-field style="Heading 1" layout="Heading 1">El Gamal generation</Text-field> q := nextprime(rand(10^40)()); k := rand(10^20)(); Ikk+WkNBYyQqeSdRcSZcTEEkel96KHkwJCo= IjUqKVxVeGRiKCo+IyopKQ== s := 1: p := 2*s*k*q+1: while not(isprime(p)) do s:= s+1: p := 2*s*k*q+1: end do: "factors of s" =ifactor(s); "factors of k " = ifactor(k); 'p' = p; L1EtZmFjdG9yc35vZn5zNiIqJi1JIUdGJDYjIiIkIiIiKS1GJzYjIiImIiIjRio= L1EuZmFjdG9yc35vZn5rfjYiKiYtSSFHRiQ2IyIxTCFReG8lR3RWIiIiLUYnNiMiJkwuI0Yq L0kicEc2IiJqbl5PWSNldElnWlhmaU8/KkchW3lvP0J5KFJwaHokZlFCVDc= for i from 3 to 20 do testSet := (Power(i,(p-1)/2) mod p, Power(i,(p-1)/3) mod p, Power(i,(p-1)/5) mod p, Power(i,(p-1)/20333) mod p, Power(i,(p-1)/4373284687738033) mod p, Power(i,(p-1)/q) mod p): gentest := min(testSet): print([i,gentest]); end do: NyQiIiQiaG5XPmtTUVhuXiMqNFkiZnYsUnVYbiM9SFpgKnlsZzZacSUp NyQiIiUiIiI= NyQiIiYiIiI= NyQiIiciIiI= NyQiIigiIiI= NyQiIikiIiI= NyQiIioiIiI= NyQiIzUiIiI= NyQiIzYiaG56OEJvS1gtNi5AY0E8KmUhPlFEMygpUnFVPlZIMiN6VVA= NyQiIzciaG5XPmtTUVhuXiMqNFkiZnYsUnVYbiM9SFpgKnlsZzZacSUp NyQiIzgiIiI= NyQiIzkiaW4oKip6R20hKUgjUiVcRzhjPHcoSEtNTmc1JnojbyJ6Xi0lcDw+ NyQiIzoiaG5XPmtTUVhuXiMqNFkiZnYsUnVYbiM9SFpgKnlsZzZacSUp NyQiIzsiIiI= NyQiIzwiIiI= NyQiIz0iaG5aJiopM21BJClSXiJ5akcmPWp2TSRILjd4Z0xWLSEqZkleSCk= NyQiIz4iaG5eUyY9QUFNeXkrMGx6KVtoJlFmZyJcIW87OyMzUUs9RkMj NyQiIz8iIiI= alpha := 3; a := rand(10^4..p-10)(); beta := Power(alpha,a) mod p;