DIRECTORY BigCardinals, RSA; RSAImpl: CEDAR PROGRAM IMPORTS BigCardinals EXPORTS RSA = BEGIN OPEN BigCardinals; ConditionedPrime: PROC [length: CARDINAL] RETURNS [prime: BigCARD, c1, c2: CARDINAL _ 0] ~ { one: BigCARD _ BigFromSmall[1]; two: BigCARD _ BigFromSmall[2]; three: BigCARD _ BigFromSmall[3]; largeModThree, factorModThree, adjust: INTEGER; large: BigCARD _ BigRandom[2*length/3 + 1]; factor: BigCARD _ BigRandom[length/3]; IF NOT BigOdd[large] THEN large _ BigAdd[large, one]; UNTIL BigPrimeTest[large] DO large _ BigAdd[large, two]; c1 _ c1 + 1; ENDLOOP; largeModThree _ BigToSmall[BigDivMod[large, three].rem]; IF BigOdd[factor] THEN factor _ BigAdd[factor, one]; factorModThree _ BigToSmall[BigDivMod[factor, three].rem]; adjust _ (2*(factorModThree - largeModThree) + 6) MOD 6; factor _ BigAdd[factor, BigFromSmall[adjust] ]; prime _ BigAdd[BigMultiply[large, factor], one]; large _ BigMultiply[large, BigFromSmall[6] ]; UNTIL BigPrimeTest[prime] DO prime _ BigAdd[prime, large]; c2 _ c2 + 1; ENDLOOP; }; KeyGenerate: PUBLIC PROC [length: CARDINAL] RETURNS [public, private: BigCARD, pc1, pc2, qc1, qc2: CARDINAL] ~ { one: BigCARD _ BigFromSmall[1]; three: BigCARD _ BigFromSmall[3]; p, q: BigCARD; [p, pc1, pc2] _ ConditionedPrime[2*length/5 + 1]; [q, qc1, qc2] _ ConditionedPrime[3*length/5]; public _ BigMultiply[p, q]; private _ BigInverse[three, BigMultiply[BigSubtract[p, one], BigSubtract[q, one]]]; }; Encrypt: PUBLIC PROC [plain, public: BigCARD] RETURNS [encrypted: BigCARD] ~ { encrypted _ BigExponentiate[plain, BigFromSmall[3], public] }; Decrypt: PUBLIC PROC [encrypted, public, private: BigCARD] RETURNS [plain: BigCARD] ~ { plain _ BigExponentiate[encrypted, private, public] }; Test: PROC [iterations: CARDINAL] RETURNS [BOOLEAN] ~ { prime, message, public, private, coded, uncoded: BigCARD; pc1, pc2, qc1, qc2: CARDINAL; THROUGH [0..iterations) DO [prime, pc1, pc2] _ ConditionedPrime[3]; IF BigZero[BigDivMod[BigSubtract[prime, BigFromSmall[1]],BigFromSmall[3]].rem] THEN ERROR; message _ BigRandom[4]; [public, private, pc1, pc2, qc1, qc2] _ KeyGenerate[5]; coded _ Encrypt[message,public]; uncoded _ Decrypt[coded,public,private]; IF NOT BigCompare[message, uncoded] = bigEqual THEN ERROR ENDLOOP; RETURN[TRUE]; }; Stats: PROC [iterations: CARDINAL] RETURNS [tc1, tc2: LONG CARDINAL _ 0] ~ { prime: BigCARD; c1, c2: CARDINAL; THROUGH [0..iterations) DO [prime, c1, c2] _ ConditionedPrime[25]; tc1 _ tc1 + c1; tc2 _ tc2 + c2; ENDLOOP; }; END. ìRSAImpl.mesa --Test Data &depth _ 7 &keys _ rsaimpl.KeyGenerate[25] &message _ BigCardinalsImpl.BigRandom[24] &coded _ rsaimpl.Encrypt[&message,&keys.public] &uncoded _ rsaimpl.Decrypt[&coded,&keys.public,&keys.private] Ê‹˜Jšœ ™ J˜JšÏk œœ˜šœ œ˜Jšœ ˜Jšœœ˜ —Jšœœ˜J˜J˜š Ïnœœ œœœ ˜\J˜J˜J˜!J˜Jšœ'œ˜/J˜J˜+J˜&J˜Jšœœœ˜5J˜šœ˜J˜J˜ Jšœ˜J˜—J˜8Jšœœ˜4Jšœ:˜:Jšœ2œ˜8˜/J˜—J˜0J˜-J˜šœ˜J˜J˜ Jšœ˜ —J˜—J˜š ž œœœ œœ0œ˜pJ˜AJ˜J˜J˜1J˜-J˜J˜J˜SJ˜—J˜šžœœœœ˜NJ˜>—J˜šžœœœ'œ˜WJ˜6—J˜Jš žœœœœœ˜7J˜9šœœ˜šœ˜J˜(šœ%˜'Jšœ'œœ˜2J˜—J˜J˜7J˜ J˜(Jšœœ)œ˜9Jšœ˜—Jšœœ˜ J˜—˜J˜—š žœœœœ œœ ˜LJ˜Jšœœ˜šœ˜J˜'J˜ Jšœ˜—J˜—J˜Jšœ˜J™Ø—…— Æ =