X-Git-Url: http://www.git.cypherpunks.ru/?a=blobdiff_plain;f=pygost%2Fgost3412.py;h=6482a4e18b6eeeac3c0d1609840c30716631b5cc;hb=4ff0adf8cb4b497daa634e2430a4fd015a2bb427;hp=70c1c900b87a9ca8a5114bacee44cb146711f408;hpb=b79ed604b7580f2b1d4e3eeb8685a2924c8fc64f;p=pygost.git diff --git a/pygost/gost3412.py b/pygost/gost3412.py index 70c1c90..6482a4e 100644 --- a/pygost/gost3412.py +++ b/pygost/gost3412.py @@ -1,6 +1,6 @@ # coding: utf-8 # PyGOST -- Pure Python GOST cryptographic functions library -# Copyright (C) 2015-2016 Sergey Matveev +# Copyright (C) 2015-2018 Sergey Matveev # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -14,15 +14,15 @@ # # You should have received a copy of the GNU General Public License # along with this program. If not, see . -"""GOST 34.12-2015 128-bit block cipher Кузнечик (Kuznechik) - -:rfc:`7801`. Pay attention that 34.12-2015 also defines 64-bit block -cipher Магма (Magma) -- it is **not** implemented here, but in gost28147 -module. +"""GOST 34.12-2015 64 and 128 bit block ciphers (:rfc:`7801`) Several precalculations are performed during this module importing. """ +from pygost.gost28147 import block2ns as gost28147_block2ns +from pygost.gost28147 import decrypt as gost28147_decrypt +from pygost.gost28147 import encrypt as gost28147_encrypt +from pygost.gost28147 import ns2block as gost28147_ns2block from pygost.utils import strxor from pygost.utils import xrange # pylint: disable=redefined-builtin @@ -121,7 +121,7 @@ def lp(blk): return L([PI[v] for v in blk]) -class GOST3412Kuz(object): +class GOST3412Kuznechik(object): """GOST 34.12-2015 128-bit block cipher Кузнечик (Kuznechik) """ def __init__(self, key): @@ -152,3 +152,30 @@ class GOST3412Kuz(object): for i in range(9, 0, -1): blk = [PIinv[v] for v in Linv(bytearray(strxor(self.ks[i], blk)))] return bytes(strxor(self.ks[0], blk)) + + +class GOST3412Magma(object): + """GOST 34.12-2015 64-bit block cipher Магма (Magma) + """ + def __init__(self, key): + """ + :param key: encryption/decryption key + :type key: bytes, 32 bytes + """ + # Backward compatibility key preparation for 28147-89 key schedule + self.key = b"".join(key[i * 4:i * 4 + 4][::-1] for i in range(8)) + self.sbox = "Gost28147_tc26_ParamZ" + + def encrypt(self, blk): + return gost28147_ns2block(gost28147_encrypt( + self.sbox, + self.key, + gost28147_block2ns(blk[::-1]), + ))[::-1] + + def decrypt(self, blk): + return gost28147_ns2block(gost28147_decrypt( + self.sbox, + self.key, + gost28147_block2ns(blk[::-1]), + ))[::-1]