Example #1
0
class CTR:
    def __init__(self, key, ctr, block_size=16):
        self.crypto = LEA(key)
        self.ctr = to_bytearray(ctr)
        self.bloc_size = block_size

    '''
    ctr을 +1 씩 업데이트 하는 함수
    '''

    def cal_ctr(self):
        for i in range((self.bloc_size - 1),
                       (self.bloc_size - 1) - self.bloc_size, -1):
            if self.ctr[i] != 0xff:
                self.ctr[i] += 1
                break
            else:
                self.ctr[i] = 0

    def encrypt(self, pt):
        self.buffer = bytearray()  #return buffer
        self.pt = to_bytearray(pt)
        self.ptlength = len(pt)  #return length
        '''
        16의 배수에 맞게 cnt 설정
        '''
        cnt = int(len(self.pt) / self.bloc_size)
        if ((len(self.pt) / self.bloc_size) != 0):
            cnt = len(pad(self.pt))

        for i in range(cnt):
            self.buffer += xorAr(self.crypto.encrypt(
                self.ctr), self.pt[(self.bloc_size * i):(self.bloc_size * i) +
                                   self.bloc_size])  #암호화 진행
            self.cal_ctr()  #ctr update

        return self.buffer[:self.ptlength]

    def decrypt(self, ct):
        self.buffer = bytearray()  #return buffer
        self.ct = ct
        self.ctlength = len(ct)  #return length
        '''
        16의 배수에 맞게 cnt 설정
        '''
        cnt = int(len(self.ct) / self.bloc_size)
        if ((len(self.ct) / self.bloc_size) != 0):
            cnt = len(pad(self.ct))

        for i in range(cnt):
            self.buffer += xorAr(self.crypto.encrypt(
                self.ctr), self.ct[(self.bloc_size * i):(self.bloc_size * i) +
                                   self.bloc_size])  #암호화 진행
            self.cal_ctr()  #ctr update

        return self.buffer[:self.ctlength]
Example #2
0
class ECB:
    def __init__(self, key, block_size=16):
        self.crypto = LEA(key)  #암호 알고리즘 호출
        self.block_size = block_size  #block size

    def encrypt(self, pt):
        self.buffer = bytearray()  #리턴할 buffer

        self.pt = pad(pt)  #padding
        self.pt = to_bytearray(self.pt)  #to bytearray
        cnt = int(len(self.pt) / self.block_size)  #count
        '''
        암호화 진행
        '''
        for i in range(cnt):
            buf = self.pt[(self.block_size * i):(self.block_size * i) +
                          self.block_size]  #block 자르기
            enc = self.crypto.encrypt(buf)
            self.buffer += enc

        return self.buffer

    def decrypt(self, ct):
        self.buffer = bytearray()  #리턴할 buffer
        self.ct = ct
        cnt = int(len(self.ct) / self.block_size)  #count
        '''
        복호화 진행
        '''
        for i in range(cnt):
            buf = self.ct[(self.block_size * i):(self.block_size * i) +
                          self.block_size]  #block 자르기
            dec = self.crypto.decrypt(buf)
            self.buffer += dec

        self.buffer = unpad(self.buffer)  #unpadding
        return self.buffer
Example #3
0
 def __init__(self, key, block_size=16):
     self.crypto = LEA(key)  #암호 알고리즘 호출
     self.block_size = block_size  #block size
Example #4
0
 def __init__(self, key, iv, block_size=16):
     self.crypto = LEA(key)
     self.iv = to_bytearray(iv)
     self.block_size = block_size
Example #5
0
class OFB:
    def __init__(self, key, iv, block_size=16):
        self.crypto = LEA(key)
        self.iv = to_bytearray(iv)
        self.block_size = block_size

    def encrypt(self, pt):
        self.buffer = bytearray()  #return할 buffer
        self.enciv = bytearray()  #암호화 시킨 iv를 한꺼번에 저장할 buffer
        self.pt = to_bytearray(pt)
        self.ptlength = len(pt)  #리턴시킬 암호문 길이
        '''
        block count 설정
        16배수면 그대로
        16배수가 아니면 padding을 통해 16배수로 만들어주고 count 설정
        '''
        cnt = int(len(pad(self.pt)) / self.block_size)
        if ((len(self.pt) % self.block_size) != 0):
            cnt = len(pad(self.pt)) / self.block_size
        '''
        iv 미리 계산
        '''

        tmp = self.iv  #입력 iv
        for i in range(cnt - 1):
            tmp = self.crypto.encrypt(tmp)
            self.enciv += tmp  #iv계산 저장
        '''
        암호화 진행
        '''
        for i in range(cnt):
            buf1 = self.enciv[(self.block_size * i):(self.block_size * i) +
                              self.block_size]  #block size에 맞게 미리 계산한 iv 자르기
            buf2 = self.pt[(self.block_size * i):(self.block_size * i) +
                           self.block_size]  #block size로 평문 자르기
            self.buffer += xorAr(buf1, buf2)  #xor 진행

        return self.buffer[:self.ptlength]  #평문 길이만큼 return

    def decrypt(self, ct):
        self.buffer = bytearray()  #return buffer
        self.enciv = bytearray()  #계산한 iv를 한꺼번에 저장할 buffer
        self.ctlength = len(ct)  #return할 cipher text의 길이 저장
        self.ct = ct
        '''
        16배수이면 그대로
        16배수가 아니면 패딩해서 16배수로 맞춘다음 count 설정
        '''
        cnt = int(len(pad(self.ct)) / self.block_size)
        if ((len(self.ct) % self.block_size) != 0):
            cnt = len(pad(self.ct)) / self.block_size
        '''
        iv 미리 계산
        '''
        tmp = self.iv
        for i in range(cnt - 1):
            tmp = self.crypto.encrypt(tmp)
            self.enciv += tmp

        for i in range(cnt):
            buf1 = self.enciv[
                (self.block_size * i):(self.block_size * i) +
                self.block_size]  #미리 계산한 enciv buffer를 block size에 맞게 자르기
            buf2 = self.ct[(self.block_size * i):(self.block_size * i) +
                           self.block_size]  #block size에 맞게 cipher text 자르기
            self.buffer += xorAr(buf1, buf2)  #xor 진행

        return self.buffer[:self.ctlength]
Example #6
0
 def __init__(self, key, ctr, block_size=16):
     self.crypto = LEA(key)
     self.ctr = to_bytearray(ctr)
     self.bloc_size = block_size
Example #7
0
 def __init__(self, key,iv, block_size = 16):
     self.crypto = LEA(key) #암호 알고리즘 선언
     self.iv = to_bytearray(iv) #iv convert to byte array
     self.block_size = block_size #block size setting
Example #8
0
class CFB:
    def __init__(self, key,iv, block_size = 16):
        self.crypto = LEA(key) #암호 알고리즘 선언
        self.iv = to_bytearray(iv) #iv convert to byte array
        self.block_size = block_size #block size setting
        

    def encrypt(self, pt):
        self.buffer = bytearray() #return buffer
        self.pt = to_bytearray(pt) #plain text convert to bytearray
        self.ptlength = len(pt) #return할 cipher ptext 길이
        
        
        '''
        평문의 길이가 16의 배수이면 그대로 cnt설정
        16의 배수가 아니면 padding을 해서 16의 배수로 만든 다음 cnt 설정
        '''
        cnt = int(len(self.pt)/self.block_size)
        if((len(self.pt)/self.block_size) != 0):
            cnt = len(pad(self.pt))
        
        c0 = self.iv #cipher block
        for i in range(cnt-1):
            buf = self.pt[(self.block_size * i) : (self.block_size*i) + self.block_size] #block size로 plain text 자르기
            c0 = self.crypto.encrypt(c0) #암호화
            c0 = xorAr(buf, c0) #xor 진행 and cipher block update
            self.buffer += c0 #adding block
            

        
        return self.buffer[:self.ptlength]

    def decrypt(self, ct):
        self.buffer = bytearray() #return buffer
        self.enciv = bytearray() #미리 계산할 iv를 저장하는 buffer
        self.ct = ct
        self.ctlength = len(ct) #return length

        '''
        만약 cipher block의 크기가 16의 배수가 아니면 padding해서 16배수로 맞춘다.
        '''
        if len(self.ct)%self.block_size != 0:
            self.ct = pad(ct)

        cnt = int(len(self.ct)/self.block_size)   #count setting    
        c0 = self.iv #초기 입력
        
        '''
        iv 미리 계산
        '''
        self.enciv += self.crypto.encrypt(c0) #cipher block 저장 (미리 iv 계산)
        for i in range(cnt-1):
            buf = self.ct[(self.block_size * i) : (self.block_size * i) + self.block_size] #cipher text 자르기
            self.enciv += self.crypto.encrypt(buf) #cipher block 추가

        '''
        복호화 진행
        '''
        for i in range(cnt):
            buf1 = self.enciv[(self.block_size * i) : (self.block_size*i) + self.block_size] #미리 계산한 iv를 block size에 맞게 자르기
            buf2 = self.ct[(self.block_size * i) : (self.block_size*i) + self.block_size] #block size에 맞게 cipher text 자르기
            self.buffer += xorAr(buf1,buf2)   #xor 진행
        return self.buffer[:self.ctlength]