【问题标题】:Object type <class 'str'> cannot be passed to C code - virtual environment对象类型 <class 'str'> 无法传递给 C 代码 - 虚拟环境
【发布时间】:2018-10-22 11:47:06
【问题描述】:

我正在使用 Mac Anaconda。我尝试使用加密的 AES。但是,我遇到了一个奇怪的问题。

我只想执行一行简单的代码:

 obj = AES.new('This is a key123', AES.MODE_CBC, 'This is an IV456')

如果我在没有虚拟环境的情况下运行代码,如下所示。

$ python

Python 3.6.4 |Anaconda, Inc.| (default, Jan 16 2018, 12:04:33) 
[GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)] on darwin
Type "help", "copyright", "credits" or "license" for more 
information.
>>> from Crypto.Cipher import AES

>>> obj = AES.new('This is a key123', AES.MODE_CBC, 'This is an IV456')

如果我使用虚拟环境“testaes”运行,则会出现错误:

(testaes)$ python
Python 3.6.4 |Anaconda, Inc.| (default, Mar 12 2018, 20:05:31) 
[GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from Crypto.Cipher import AES

>>> obj = AES.new('This is a key123', AES.MODE_CBC, 'This is an IV456')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Applications/anaconda3/envs/testaes/lib/python3.6/site-packages/Crypto/Cipher/AES.py", line 200, in new
return _create_cipher(sys.modules[__name__], key, mode, *args, **kwargs)
File "/Applications/anaconda3/envs/testaes/lib/python3.6/site-packages/Crypto/Cipher/__init__.py", line 55, in _create_cipher
return modes[mode](factory, **kwargs)
File "/Applications/anaconda3/envs/testaes/lib/python3.6/site-packages/Crypto/Cipher/_mode_cbc.py", line 234, in _create_cbc_cipher
cipher_state = factory._create_base_cipher(kwargs)
File "/Applications/anaconda3/envs/testaes/lib/python3.6/site-packages/Crypto/Cipher/AES.py", line 100, in _create_base_cipher
result = start_operation(c_uint8_ptr(key),
File "/Applications/anaconda3/envs/testaes/lib/python3.6/site-packages/Crypto/Util/_raw_api.py", line 109, in c_uint8_ptr
raise TypeError("Object type %s cannot be passed to C code" % type(data))
TypeError: Object type <class 'str'> cannot be passed to C code

您可以看到,我两次都使用相同的 Anaconda Python 3.6.4 和 GCC4.2.1。如何解决?

【问题讨论】:

  • 你不能加密文本,只能加密字节。
  • 我认为您应该查看回溯的最后一行。查看将字符串编码为字节是否有效。
  • 在这两种情况下Crypto.version_info 是什么?

标签: python anaconda


【解决方案1】:

在 Python 3 中,将其编码为 bytearray:

obj = AES.new('This is a key123'.encode("utf8"), AES.MODE_CBC, 'This is an IV456'.encode("utf8"))

如果您将这些存储在变量中并想再次将它们用作(Python)字符串,只需使用:

key_as_bytearray.decode("utf8")

查看this answer了解更多信息。

【讨论】:

  • 如果这确实是问题b"This is a key123" 没有任何编码步骤也可以。
  • 谢谢。它解决了这个问题。我确实尝试使用密钥进行编码(“utf8)”,但我没有对IV进行编码。
  • @geenFrog 如果只是 ascii 文本,那么 b"myIV" 可以正常工作,以防万一您使用其他字符/编码
【解决方案2】:

Python 有一个名为 pycryptodome 的包会导致此错误。只需卸载该包

sudo pip3 卸载 pycryptodome

【讨论】:

  • 嗨,Saurabh,在写下一个之前,请先熟悉writing an answer!享受您在 SO 的住宿:)
  • 这不是一个答案,因为问题与这个答案提到的库无关。
  • 要添加上下文,pycryptodome 需要在github.com/Legrandin/pycryptodome/issues/488 中传递字节——pycrypto 不需要。强烈建议不要卸载 pycryptodome 而是传入字节,因为 pycrypto 存在安全问题。
猜你喜欢
  • 1970-01-01
  • 2021-09-08
  • 1970-01-01
  • 2021-09-17
  • 2019-12-01
  • 2014-12-01
  • 1970-01-01
  • 2020-11-19
  • 2021-09-14
相关资源
最近更新 更多