43 lines
1.2 KiB
Python
43 lines
1.2 KiB
Python
from Crypto.Util.number import *
|
|
|
|
|
|
class Key:
|
|
def __init__(self, bits):
|
|
assert bits >= 512
|
|
self.p = getPrime(bits)
|
|
self.q = getPrime(bits)
|
|
self.n = self.p * self.q
|
|
self.e = 0x100007
|
|
self.d = inverse(self.e, (self.p-1)*(self.q-1))
|
|
self.dmp1 = self.d%(self.p-1)
|
|
self.dmq1 = self.d%(self.q-1)
|
|
self.iqmp = inverse(self.q, self.p)
|
|
self.ipmq = inverse(self.p, self.q)
|
|
|
|
def encrypt(self, data):
|
|
num = bytes_to_long(data)
|
|
result = pow(num, self.e, self.n)
|
|
return long_to_bytes(result)
|
|
|
|
def decrypt(self, data):
|
|
num = bytes_to_long(data)
|
|
v1 = pow(num, self.dmp1, self.p)
|
|
v2 = pow(num, self.dmq1, self.q)
|
|
result = (v2*self.p*self.ipmq+v1*self.q*self.iqmp) % self.n
|
|
return long_to_bytes(result)
|
|
|
|
def __str__(self):
|
|
return "Key([e = {0}, n = {1}, x = {2}, y = {3}])".format(self.e, self.d, self.iqmp, self.ipmq)
|
|
|
|
def main():
|
|
key = Key(1024)
|
|
flag = open('flag').read()
|
|
encrypt_flag = key.encrypt(flag)
|
|
assert key.decrypt(encrypt_flag) == flag
|
|
print key
|
|
print encrypt_flag.encode('hex')
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|