| 93 | return KeyPair(Key(public, composite), Key(private, composite)) |
| 94 | |
| 95 | def encode(msg, pubkey, verbose=False): |
| 96 | chunksize = int(log(pubkey.modulus, 256)) |
| 97 | outchunk = chunksize + 1 |
| 98 | outfmt = '%%0%dx' % (outchunk * 2,) |
| 99 | bmsg = msg.encode() |
| 100 | result = [] |
| 101 | for start in range(0, len(bmsg), chunksize): |
| 102 | chunk = bmsg[start:start+chunksize] |
| 103 | chunk += b'\x00' * (chunksize - len(chunk)) |
| 104 | plain = int(hexlify(chunk), 16) |
| 105 | coded = pow(plain, *pubkey) |
| 106 | bcoded = unhexlify((outfmt % coded).encode()) |
| 107 | if verbose: print('Encode:', chunksize, chunk, plain, coded, bcoded) |
| 108 | result.append(bcoded) |
| 109 | return b''.join(result) |
| 110 | |
| 111 | def decode(bcipher, privkey, verbose=False): |
| 112 | chunksize = int(log(pubkey.modulus, 256)) |