栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

CTR中的AES如何在带有PyCrypto的Python上工作?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

CTR中的AES如何在带有PyCrypto的Python上工作?

据@gertvdijk,AES_CTR是不流密码 并不 需要填充。所以我删除了相关代码。

这是我所知道的。

  1. 您必须

    AES.new(...)
    在加密和解密中使用相同的密钥(中的第一个参数),并将密钥保密。

  2. 加密/解密方法是 有状态的 ,这意味着

    crypto.en(de)crypt("abcd")==crypto.en(de)crypt("abcd")
    总是如此。在您的点击率中,计数器回调始终返回相同的内容,因此在加密时它变为无状态(我不是100%确信这是原因),但我们仍然发现它在解密中有些状态。结论是,我们应该始终使用一个新的对象来执行它们。

  3. counter callback
    加密和解密中的功能应具有相同的行为。在您的情况下,是使它们都返回相同的秘密。但是我不认为这
    secret
    是“秘密”。您可以使用生成的随机数
    "secret"
    ,并在不进行任何加密的情况下将其传递给通信的对等方,以便另一端可以直接使用它, 前提
    secret
    不可预测的

因此,我将这样编写密码,希望它会有所帮助。

import osimport hashlibimport Crypto.Cipher.AES as AESclass Cipher:        @staticmethod        def md5sum( raw ):     m = hashlib.md5()     m.update(raw)     return m.hexdigest()        BS = AES.block_size        @staticmethod         def pad( s ):     """note that the padding is no necessary"""     """return s + (Cipher.BS - len(s) % Cipher.BS) * chr(Cipher.BS - len(s) % Cipher.BS)"""     return s        @staticmethod        def unpad( s ):     """return s[0:-ord(s[-1])]"""     return s        def __init__(self, key):     self.key = Cipher.md5sum(key)     #the state of the counter callback      self.cnter_cb_called = 0      self.secret = None        def _reset_counter_callback_state( self, secret ):     self.cnter_cb_called = 0     self.secret = secret        def _counter_callback( self ):     """     this function should be stateful     """     self.cnter_cb_called += 1     return self.secret[self.cnter_cb_called % Cipher.BS] * Cipher.BS        def encrypt(self, raw):     secret = os.urandom( Cipher.BS ) #random choose a "secret" which is not secret     self._reset_counter_callback_state( secret )     cipher = AES.new( self.key, AES.MODE_CTR, counter = self._counter_callback )     raw_padded = Cipher.pad( raw )     enc_padded = cipher.encrypt( raw_padded )     return secret+enc_padded #yes, it is not secret        def decrypt(self, enc):     secret = enc[:Cipher.BS]     self._reset_counter_callback_state( secret )     cipher = AES.new( self.key, AES.MODE_CTR, counter = self._counter_callback )     enc_padded = enc[Cipher.BS:] #we didn't encrypt the secret, so don't decrypt it     raw_padded = cipher.decrypt( enc_padded )     return Cipher.unpad( raw_padded )

一些测试:

>>> from Cipher import Cipher>>> x = Cipher("this is key")>>> "a"==x.decrypt(x.encrypt("a"))True>>> "b"==x.decrypt(x.encrypt("b"))True>>> "c"==x.decrypt(x.encrypt("c"))True>>> x.encrypt("a")==x.encrypt("a")False #though the input is same, the outputs are different

参考:http :
//packages.python.org/pycrypto/Crypto.Cipher.blockalgo-
module.html#MODE_CTR



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/646820.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号