Contract con_otp_v1


Contract Code


  
1 # con_otp_v1
2 random.seed()
3
4
5 def encrypt_int(message: int, otp: int, safe: bool = True) -> int:
6 assert message >= 0, "Only non-negative numbers are supported"
7 assert not safe or message <= otp, "The message %i is too long" % (message)
8 return message ^ otp
9
10
11 def bit_size(num: int) -> int:
12 assert isinstance(num, int), "bit_size(num) only supports integers, not %r" % type(num)
13 return num.bit_length()
14
15
16 def byte_size(number: int) -> int:
17 if number == 0:
18 return 1
19 return div_ceil(bit_size(number), 8)
20
21
22 def int2bytes(number: int, fill_size: int = 0) -> bytes:
23 assert number >= 0, "Number must be an unsigned integer: %d" % number
24 bytes_required = max(1, div_ceil(number.bit_length(), 8))
25 if fill_size > 0:
26 return number.to_bytes(fill_size, "big")
27 return number.to_bytes(bytes_required, "big")
28
29
30 def bytes2int(raw_bytes: bytes) -> int:
31 return int.from_bytes(raw_bytes, "big", signed=False)
32
33
34 def div_ceil(a: int, b: int) -> int:
35 return a//b + bool(a%b)
36
37
38 @export
39 def encrypt(message_str: str, otp: int, safe: bool = True) -> str:
40 message_bytes = message_str.encode()
41 message_int = bytes2int(message_bytes)
42 key_length = max(byte_size(otp), len(message_bytes))
43 encrypted_int = encrypt_int(message_int, otp, safe=safe)
44 encrypted_bytes = int2bytes(encrypted_int, key_length)
45 return encrypted_bytes.hex()
46
47 @export
48 def encrypt_hex(message_str: str, otp: int, safe: bool = True) -> str:
49 message_bytes = bytes.fromhex(message_str)
50 message_int = bytes2int(message_bytes)
51 key_length = max(byte_size(otp), len(message_bytes))
52 encrypted_int = encrypt_int(message_int, otp, safe=safe)
53 encrypted_bytes = int2bytes(encrypted_int, key_length)
54 return encrypted_bytes.hex()
55
56 @export
57 def decrypt(encrypted_str: str, otp: int, safe: bool = True) -> str:
58 encrypted_bytes = bytes.fromhex(encrypted_str)
59 encrypted_int = bytes2int(encrypted_bytes)
60 key_length = max(byte_size(otp), len(encrypted_bytes))
61 decrypted_int = encrypt_int(otp, encrypted_int, safe=safe)
62 decrypted_bytes = int2bytes(decrypted_int, key_length)
63 return decrypted_bytes.lstrip(b'\x00').decode()
64
65 @export
66 def decrypt_hex(encrypted_str: str, otp: int, safe: bool = True) -> str:
67 encrypted_bytes = bytes.fromhex(encrypted_str)
68 encrypted_int = bytes2int(encrypted_bytes)
69 key_length = max(byte_size(otp), len(encrypted_bytes))
70 decrypted_int = encrypt_int(otp, encrypted_int, safe=safe)
71 decrypted_bytes = int2bytes(decrypted_int, key_length)
72 return decrypted_bytes.hex()
73
74 @export
75 def generate_otp(n_bits: int) -> int:
76 return random.getrandbits(n_bits)
77
78
79 @construct
80 def seed():
81 pass

Byte Code

e30000000000000000000000000700000040000000731001000065006a01830001006425650265026503650264019c046402640384055a046502650264049c026405640684045a056502650264079c026408640984045a066426650265026507640b9c03640c640d84055a0865076502640e9c02640f641084045a0965026502650264119c036412641384045a0a650b641483016427650c65026503650c64159c0464166417840583015a0d650b641483016428650c65026503650c64159c0464186419840583015a0e650b641483016429650c65026503650c641a9c04641b641c840583015a0f650b64148301642a650c65026503650c641a9c04641d641e840583015a10650b6414830165026502641f9c0264206421840483015a116422642384005a1264245300292b542904da076d657373616765da036f7470da0473616665da0672657475726e63030000000000000003000000030000004300000073320000007c0064016b05731074006402830182017c020c00732a7c007c016b01732a740064037c001600830182017c007c014100530029044ee9000000007a274f6e6c79206e6f6e2d6e65676174697665206e756d626572732061726520737570706f727465647a1a546865206d65737361676520256920697320746f6f206c6f6e672901da0e417373657274696f6e4572726f722903720100000072020000007203000000a9007207000000da00da0d5f5f656e63727970745f696e74040000007306000000000110011a0172090000002902da036e756d7204000000630100000000000000010000000400000043000000732200000074007c0074018302731a7402640174037c0083011600830182017c006a048300530029024e7a2c6269745f73697a65286e756d29206f6e6c7920737570706f72747320696e7465676572732c206e6f742025722905da0a6973696e7374616e6365da03696e747206000000da0474797065da0a6269745f6c656e6774682901720a000000720700000072070000007208000000da0a5f5f6269745f73697a650a000000730600000000010c010e01720f0000002902da066e756d6265727204000000630100000000000000010000000300000043000000731a0000007c0064016b02720c64025300740074017c00830164038302530029044e7205000000e901000000e9080000002902da0a5f5f6469765f6365696c720f00000029017210000000720700000072070000007208000000da0b5f5f627974655f73697a651000000073060000000001080104017214000000720500000029037210000000da0966696c6c5f73697a65720400000063020000000000000003000000050000004300000073480000007c0064016b057314740064027c001600830182017401640374027c006a0383006404830283027d027c0164016b04723c7c006a047c016405830253007c006a047c0264058302530029064e72050000007a264e756d626572206d75737420626520616e20756e7369676e656420696e74656765723a20256472110000007212000000da0362696729057206000000da036d61787213000000720e000000da08746f5f6279746573290372100000007215000000da0e62797465735f7265717569726564720700000072070000007208000000da0b5f5f696e7432627974657316000000730a00000000011401140108010c01721a0000002902da097261775f62797465737204000000630100000000000000010000000500000043000000731000000074006a017c006401640264038d03530029044e7216000000462901da067369676e65642902720c000000da0a66726f6d5f62797465732901721b000000720700000072070000007208000000da0b5f5f627974657332696e741e00000073020000000001721e0000002903da0161da0162720400000063020000000000000002000000040000004300000073140000007c007c011a0074007c007c01160083011700530029014e2901da04626f6f6c2902721f0000007220000000720700000072070000007208000000721300000022000000730200000000017213000000da0a636f6e5f6f74705f76312904da0b6d6573736167655f73747272020000007203000000720400000063030000000000000008000000050000004300000073420000007c006a0083007d0374017c0383017d04740274037c01830174047c03830183027d0574057c047c017c0264018d037d0674067c067c0583027d077c076a078300530029024e290172030000002908da06656e636f6465721e00000072170000007214000000da036c656e7209000000721a000000da036865782908722300000072020000007203000000da0d6d6573736167655f6279746573da0b6d6573736167655f696e74da0a6b65795f6c656e677468da0d656e637279707465645f696e74da0f656e637279707465645f6279746573720700000072070000007208000000da07656e637279707426000000730c00000000020801080112010e010a01722c000000630300000000000000080000000500000043000000734400000074006a017c0083017d0374027c0383017d04740374047c01830174057c03830183027d0574067c047c017c0264018d037d0674077c067c0583027d077c076a088300530029024e290172030000002909da056279746573da0766726f6d686578721e0000007217000000721400000072250000007209000000721a00000072260000002908722300000072020000007203000000722700000072280000007229000000722a000000722b000000720700000072070000007208000000da0b656e63727970745f68657830000000730c00000000020a01080112010e010a01722f0000002904da0d656e637279707465645f737472720200000072030000007204000000630300000000000000080000000500000043000000734a00000074006a017c0083017d0374027c0383017d04740374047c01830174057c03830183027d0574067c017c047c0264018d037d0674077c067c0583027d077c076a08640283016a098300530029034e29017203000000f30100000000290a722d000000722e000000721e0000007217000000721400000072250000007209000000721a000000da066c7374726970da066465636f64652908723000000072020000007203000000722b000000722a0000007229000000da0d6465637279707465645f696e74da0f6465637279707465645f6279746573720700000072070000007208000000da07646563727970743a000000730c00000000020a01080112010e010a017236000000630300000000000000080000000500000043000000734400000074006a017c0083017d0374027c0383017d04740374047c01830174057c03830183027d0574067c017c047c0264018d037d0674077c067c0583027d077c076a088300530029024e290172030000002909722d000000722e000000721e0000007217000000721400000072250000007209000000721a00000072260000002908723000000072020000007203000000722b000000722a000000722900000072340000007235000000720700000072070000007208000000da0b646563727970745f68657844000000730c00000000020a01080112010e010a0172370000002902da066e5f626974737204000000630100000000000000010000000200000043000000730a00000074006a017c008301530029014e2902da0672616e646f6dda0b67657472616e646269747329017238000000720700000072070000007208000000da0c67656e65726174655f6f74704e00000073020000000002723b00000063000000000000000000000000010000004300000073040000006400530029014e72070000007207000000720700000072070000007208000000da045f5f5f5f5300000073020000000001723c0000004e2901542901720500000029015429015429015429015429137239000000da0473656564720c00000072210000007209000000720f0000007214000000722d000000721a000000721e0000007213000000da085f5f6578706f7274da03737472722c000000722f00000072360000007237000000723b000000723c0000007207000000720700000072070000007208000000da083c6d6f64756c653e01000000732200000008031606100610061408100412040601180906011809060118090601180906011204