###################### # SCRIPT: rDSA.bdscr # ###################### # EXAMPLE OF THE rDSA from ANSI X9.31 - 1998 # Digital Signatures Using Reversible Public Key # Cryptography for the Financial Services Industry (rDSA) # TEST 1: # Appendix D.1 Odd e = 3 with 1024-bit n puts "TEST 1: Appendix D.1 Odd e = 3 with 1024-bit n" # Set input values... n=0xACD1CC46DFE54FE8F9786672664CA2690D0AD7E5003BC6427954D939EEE8B27152E6A947450D7FA980172DE064D6569A28A83FE70FA840F5E9802CB8984AB34BD5C1E6399EC21E4D3A3A69BE4E676F395AAFEF7C4925FD4FAEE9F9E5E48AF4315DF0EC2DB9AD7A350B3DF2F4D15DC0039846D1ACA3527B1A75049E3FE34F43BD d=0x1CCDA20BCFFB8D517EE9666866621B11822C7950D55F4BB5BEE37989A7D17312E326718BE0D79546EAAE87A56623B919B1715FFBD7F16028FC4007741961C88C5D7B4DAAAC8D36A98C9EFBB26C8A4A0E6BC15B358E528A1AC9D0F042BEB93BCA16B541B33F80C933A3B769285C462ED5677BFE89DF07BED5C127FD13241D3C4B i=0x6BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAA9993E364706816ABA3E25717850C26C9CD0D89D33CC e=3 # Display them... printf("n=%x\n",n) printf("d=%x\n",d) printf("e=%x\n",e) printf("RR=IR=%x\n", i) # Do the calculation... t = modexp(i,d,n) printf("t=RR^d mod n=%x\n", t) printf("n-t=%x\n", n-t) s = min(t, n-t) printf("S=min(t,n-t)=%x\n", s) r = modexp(s,e,n) printf("RR'=S^e mod n=%x\n", r) # If RR' = 12 mod 16 then IR' = RR' else IR' = n - RR' j = iif(r mod 16 == 12, r, n - r) printf("IR'=%x\n", j) # If IR' is identical to the computed hash IR, the signature verification is successful. printf("IR'==IR is %q\n", i==j) # TEST 2: # Appendix D.3 Odd e = 3 with 2048-bit n ? "\nTEST 2: Appendix D.3 Odd e = 3 with 2048-bit n" # Set input values... n=0xBCCA30CA5280BC51E758DBAFFEDFE46A5D2A78D83969E154780F9B27AD4E76E63E8FA96029C04DE3F2C4B01FECBEBB44FC2F5F8AC69BD0E3278FF0658A6F9AC23BCFB2C9AAAF1AC4D5571A55D3B1EC3550CF34D8F789235DD3B5C4E2F3DF176119D918F2D35E805B62FC35FEE5FD07854824B9846DC1665E35A31873BF6A24FE50842D0AA0305C35D0F45B0D7C2F1E9432D850D67956D383BBEF52FC2ACBF7AE6F7CA21488A56456BDF6672696EE037C3CAA2199904E37AA40134E10155FC81393A225BD129C4B3BC91AD3A5FC958A6ABCABE3550390B67787625D78F8D3172B673C4482CE354B8951D7E8C4DDCE5D4CDFA6790C6CE8C02C8D807AE26F27FE33 d=0x7DDC2086E1AB28369A3B3D1FFF3FED9C3E1C509026469638500A676FC8DEF9EED45FC6401BD58942A1D8756A9DD47CD8A81F95072F128B421A5FF59906F511D6D28A77311C74BC8338E4BC3937CBF2CE35DF7890A5061793E2792DECA294BA40BBE610A1E23F003CECA823FF43FE0503856DD102F3D6443ECE6CBAF7D4F16DFDBAF7C2F8CB4955E2F2DF29FDA7A4DD7B93785252E2CA4AAD14E8B1A17881D381DAD9061EC8AB50DDCBF8B56AFA464F01D28DFDFF0CAFF6B5588E8F776FA128DE7C1024947D5D80673F545A5C73FBC16B609A33A11021DD8F37A4E7C478AA19E3BCB1BBD8F4AA923265F1F1D55236753AC8C10D60F0FAB07366439A905E2C63AB i=0x6BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAA9993E364706816ABA3E25717850C26C9CD0D89D33CC e=3 # Display them... printf("n=%x\n",n) printf("d=%x\n",d) printf("e=%x\n",e) printf("RR=IR=%x\n", i) # Do the calculation... t = modexp(i,d,n) printf("t=RR^d mod n=%x\n", t) printf("n-t=%x\n", n-t) s = min(t, n-t) printf("S=min(t,n-t)=%x\n", s) r = modexp(s,e,n) printf("RR'=S^e mod n=%x\n", r) # If RR' = 12 mod 16 then IR' = RR' else IR' = n - RR' j = iif(r mod 16 == 12, r, n - r) printf("IR'=%x\n", j) # If IR' is identical to the computed hash IR, the signature verification is successful. printf("IR'==IR is %q\n", i==j)