我正在以这种方式使用python加密模块生成EC密钥
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.asymmetric import ec
key=ec.generate_private_key(ec.SECP256R1(), default_backend())
Run Code Online (Sandbox Code Playgroud)
EC密钥的asn.1结构如下
ECPrivateKey ::= SEQUENCE {
version INTEGER { ecPrivkeyVer1(1) } (ecPrivkeyVer1),
privateKey OCTET STRING,
parameters [0] ECParameters {{ NamedCurve }} OPTIONAL,
publicKey [1] BIT STRING OPTIONAL
}
Run Code Online (Sandbox Code Playgroud)
来自https://tools.ietf.org/html/rfc5915 setion 3.
我的问题是如何从这个密钥中获取ASN.1组件.我想将密钥对象转换为OpenSSH私钥,类似于
-----BEGIN EC PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,9549ED842979FDAF5299BD7B0E25B384
Z+B7I6jfgC9C03Kcq9rbWKo88mA5+YqxSFpnfRG4wkm2eseWBny62ax9Y1izGPvb
J7gn2eBjEph9xobNewgPfW6/3ZDw9VGeaBAYRkSolNRadyN2Su6OaT9a2gKiVQi+
mqFeJmxsLyvew9XPkZqQIjML1d1M3T3oSA32zYX21UY=
-----END EC PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)
处理DSA或RSA很容易,因为所有ASN.1参数都是整数.
先感谢您
我正在尝试为有效负载生成签名。我的技术栈是 Python3.6,它提供了密码学或 pycrypto 之类的库。问题是,我无法private_encrypt在密码学等库中重新创建M2Crypto的功能。M2Crypto生成的签名被我的对端接受为有效签名,而两个库生成的签名被丢弃,表示签名无效。
我使用 python2.7 创建了一个最小的 POC 来说明我的情况。
import base64
payload = b'This is the payload for which I wish to generate signature'
### Using library cryptography ###
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization, hashes
from cryptography.hazmat.primitives.asymmetric import padding
with open("private_key", "rb") as key_file:
private_key = serialization.load_pem_private_key(
key_file.read(),
password=None,
backend=default_backend()
)
signature = private_key.sign(
payload,
padding=padding.PKCS1v15(),
algorithm=hashes.SHA1()
)
encoded_signature = base64.b16encode(signature)
print("Signature using cryptography - ", encoded_signature)
### Using library pycrypto ###
from Crypto.Signature import …Run Code Online (Sandbox Code Playgroud) 过去使用 PyCrypto 时,我能够执行以下操作来生成 RSA 公钥的指纹:
rsa_cipher = PKCS1_v1_5.new(RSA.importKey(pub_rsa_key))
hashlib.sha1(rsa_cipher._key.exportKey("DER")).hexdigest()
Run Code Online (Sandbox Code Playgroud)
如果没有 PyCrypto,我怎样才能达到同样的目的?
编辑
我提供的pub_rsa_key是一个.perm文件的内容,即:
-----BEGIN PUBLIC KEY-----
MII...AB
-----END PUBLIC KEY-----
Run Code Online (Sandbox Code Playgroud)
PyCrypto 被认为是不安全的,不再维护,所以我切换到 Python 的密码学,但它似乎没有足够的功能。
执行导出的任何文档或搜索词都会有所帮助。
编辑 2
Maarten Bodewes 的评论(谢谢)把我带到了一个似乎是我正在寻找的地方。但是DER导出的结果不同:
# Python 3.7 using Cryptography
from cryptography.hazmat.primitives import serialization
with open('pub_key.perm', 'rb') as key_file:
public_key = serialization.load_pem_public_key(key_file.read(), backend=default_backend())
pub_der = public_key.public_bytes(encoding=serialization.Encoding.DER, format=serialization.PublicFormat.PKCS1)
print(sha1(pub_der).hexdigest())
# gives "d291c142648b7........c2f4676f4213203c4bd"
Run Code Online (Sandbox Code Playgroud)
在哪里
# Python 2.7 using PyCrypto
from Crypto.Cipher …Run Code Online (Sandbox Code Playgroud) 我对 Airflow 很陌生。我已经多次通读文档,在网上阅读了许多 S/O 问题和许多随机文章,但尚未解决此问题。我有一种感觉,我做错了一些非常简单的事情。我有适用于 Windows 的 Docker,我拉取了puckel/docker-airflow映像并运行了一个暴露端口的容器,这样我就可以从我的主机访问 UI。我有另一个容器在运行mcr.microsoft.com/mssql/server,我在其中恢复了 WideWorldImporters 示例数据库。从 Airflow UI,我已经能够成功地创建到这个数据库的连接,甚至可以从数据分析部分查询它。检查下面的图像:
连接创建
成功查询到连接
因此,虽然这有效,但我的 dag 在第二个任务中失败了sqlData。这是代码:
from airflow.models import DAG
from airflow.operators.bash_operator import BashOperator
from airflow.operators.python_operator import PythonOperator
from airflow.operators.mssql_operator import MsSqlOperator
from datetime import timedelta, datetime
copyData = DAG(
dag_id='copyData',
schedule_interval='@once',
start_date=datetime(2019,1,1)
)
printHelloBash = BashOperator(
task_id = "print_hello_Bash",
bash_command = 'echo "Lets copy some data"',
dag = copyData
)
mssqlConnection = "WWI"
sqlData = MsSqlOperator(sql="select top 100 InvoiceDate, TotalDryItems from …Run Code Online (Sandbox Code Playgroud) 这个问题有很多答案,涵盖了大量不同的场景,但我还没有找到解决同样问题的方法。当我尝试安装pip install cryptography 时,我得到:
生成 cffi 模块 'build\temp.win-amd64-3.8\Release\_padding.c' 创建 build\temp.win-amd64-3.8 创建 build\temp.win-amd64-3.8\Release
生成 cffi 模块 'build\temp. win-amd64-3.8\Release\_constant_time.c' 生成 cffi 模块 'build\temp.win-amd64-3.8\Release\_openssl.c'
构建 '_openssl' 扩展创建 build\temp.win-amd64-3.8\Release\ build 创建 build\temp.win-amd64-3.8\Release\build\temp.win-amd64-3.8 创建 build\temp.win-amd64-3.8\Release\build\temp.win-amd64-3.8\Release
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.16.27023\bin\HostX86\x64\cl.exe /c /nologo /Ox /W3 /GL /DNDEBUG /MD -IC:\Users\be004cr\PycharmProjects\SSLTest\venv\include -IC:\Python\Python38\include -IC:\Python\Python38\include "-IC:\Program Files (x86)\Microsoft Visual Studio\2017\ Professional\VC\Tools\MSVC\14.16.27023\ATLMFC\include" "-IC:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.16.27023\include" "-IC :\Program Files (x86)\Windows Kits\NETFXSDK\4.6.1\include\um" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\ucrt" "-IC:\ Program Files (x86) \Windows Kits\10\include\10.0.17763.0\shared" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\um" "-IC:\Program Files (x86)\Windows …
我正在尝试使用 Python 加密库验证签名,如此处所述https://cryptography.io/en/latest/hazmat/primitives/ametry/rsa/

这是在客户端-服务器 TCP 聊天应用程序的上下文中,客户端计算了签名,并将其发送到客户端以验证它确实是正确的服务器。签名被传递给函数进行验证。
def VerifySignature(signature):
with open("server_publickey.pem", "rb") as key_file:
public_key = serialization.load_pem_public_key(
key_file.read(),
#password=None,
backend=default_backend()
)
verifier = public_key.verifier(
signature,
padding.PSS(
mgf=padding.MGF1(hashes.SHA256()),
salt_length=padding.PSS.MAX_LENGTH
),
hashes.SHA256()
)
message = b"the message that the server verified"
verifier.update(message)
if verifier.verify():
return 1
else:
return 0
Run Code Online (Sandbox Code Playgroud)
我注意到返回了 0。根据密码学规范,看起来如果 verifier.verify() 失败,它会返回异常,所以我不知道如何测试它。
目前,我有一些代码使用本机 OpenSSL 二进制文件使用 SHA256 算法对字节字符串进行签名,该代码调用外部进程,发送参数,并将结果接收回 Python 代码。
当前代码如下:
signed_digest_proc = subprocess.Popen(
['openssl', 'dgst', '-sha256', '-sign', tmp_path],
stdin=subprocess.PIPE,
stdout=subprocess.PIPE
)
signed_digest_proc.stdin.write(original_string)
signed_digest, _ = signed_digest_proc.communicate()
base64.encodestring(signed_digest).decode().replace('\n', '')
Run Code Online (Sandbox Code Playgroud)
当original_string太大时,我可能会遇到结果问题(我认为来自与外部进程的通信),这就是为什么我试图将其更改为仅限 Python 的解决方案:
import hmac, hashlib
h = hmac.new(bytes(key_pem(), 'ASCII'), original_string, hashlib.sha256)
result = base64.encodestring(h).decode().replace('\n', '')
Run Code Online (Sandbox Code Playgroud)
这导致与第一个完全不同的字符串。
在不调用外部进程的情况下实现原始代码的方法是什么?
我有一个 DER 格式的私钥。我正在尝试将其转换为 PEM 并同时使用密码加密私钥。
这是我用来转换和加密的 openssl 命令:
> openssl rsa -aes256 -inform der -in temp_key.der -outform pem -passout pass:<password>
Run Code Online (Sandbox Code Playgroud)
我正在尝试在 Python 中实现类似的逻辑,其中我拥有 DER 格式的内存中密钥的数据。我想将其更改为 PEM,对其进行加密,然后存储到文件中。
我不太熟悉 Python 的加密库,并且很难找出转换和加密我的关键数据的正确方法。
在运行测试以确保两个不同的库提供相同的输出时,我发现它们不具有CFB. 复制问题的代码是:
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from Crypto.Cipher import AES
KEY = b'legoroojlegorooj'
IV = b'legoroojlegorooj'
aes = Cipher(algorithms.AES(KEY), modes.CFB(IV), default_backend()).encryptor()
output_data = aes.update(b'Feathers fall as fast as bowling balls.') + aes.finalize()
del aes
ctr = AES.new(KEY, AES.MODE_CFB, iv=IV)
output_data2 = ctr.encrypt(b'Feathers fall as fast as bowling balls.')
assert output_data == output_data2 # AssertionError
Run Code Online (Sandbox Code Playgroud)
任何解决这个问题的帮助将不胜感激。
此代码适用于modes.OFB(IV)和AES.MODE_OFB。
我使用 Python 创建了 3 个证书:rootca.crt、intermediateca.crt 和 server.crt。我使用rootca.crt来签署intermediateca.crt,它按预期工作:
openssl verify -CAfile rootca.crt intermediateca.crt
intermediateca.crt: OK
Run Code Online (Sandbox Code Playgroud)
然后我用中间ca签署了server.crt,但验证失败:
openssl verify -CAfile rootca.crt -untrusted intermediateca.crt server.crt
server.crt: C = DE, ST = mein Bundesland, L = meine Stadt, O = meine Firma, CN = server.example.com, emailAddress = info@meine-firma.de
error 20 at 0 depth lookup:unable to get local issuer certificate
Run Code Online (Sandbox Code Playgroud)
当我解析证书时,server.crt 颁发机构密钥标识符与 middleca 主题密钥标识符相匹配。谁能给我提示可能出了什么问题?如果我使用 openssl 命令行工具生成相同的证书,它就可以工作。解析的内容是相同的,除了授权密钥标识符还包含 openssl 生成的证书的序列号和 cn 之外。
下面的代码片段使用 Cryptodome 进行 AES 解密,效果符合我的预期:
from Crypto.Cipher import AES
from Crypto.Util import Counter
key = b'\x12' * 32
decryptor = AES.new(key, AES.MODE_CTR,counter=Counter.new(nbits=128, little_endian=True))
print(decryptor.decrypt(b'Something encrypted'))
Run Code Online (Sandbox Code Playgroud)
下面使用Python Cryptography,并给出不同的结果:
from cryptography.hazmat.primitives.ciphers import Cipher, modes, algorithms
key = b'\x12' * 32
decryptor = Cipher(algorithms.AES(key), modes.CTR(b'\0' * 16)).decryptor()
print(decryptor.update(b'Something encrypted'))
Run Code Online (Sandbox Code Playgroud)
为什么?如何更改 Python Cryptography 版本以输出与 Cryptodome 相同的结果?
(上下文正在编写用于解压缩文件的 AES 解密代码,并且正在考虑使用 Python 加密)
当尝试使用从 PE 文件中提取证书时cryptography,失败并显示ValueError: Unable to load certificate. 我可以使用命令行从同一个 PE 文件中正确提取subprocess证书openssl。我想了解使用的代码版本出了什么问题cryptography。
我使用的是Python 3.7.1、加密2.4.2和pefile 2018.8.8
import pefile
from cryptography import x509
from cryptography.hazmat.backends import default_backend
pe = pefile.PE(fname)
pe.parse_data_directories(directories=[pefile.DIRECTORY_ENTRY['IMAGE_DIRECTORY_ENTRY_SECURITY']])
sigoff = 0
siglen = 0
for s in pe.__structures__:
if s.name == 'IMAGE_DIRECTORY_ENTRY_SECURITY':
sigoff = s.VirtualAddress
siglen = s.Size
pe.close()
with open(fname, 'rb') as fh:
fh.seek(sigoff)
thesig = fh.read(siglen)
cert = x509.load_der_x509_certificate(thesig[8:], default_backend())
Run Code Online (Sandbox Code Playgroud)
这失败了ValueError: Unable to load certificate
python openssl pyopenssl portable-executable python-cryptography
我正在尝试使用密码学中的危险品在 python 中生成一个公共/私人椭圆曲线密钥对。以下是我拥有的当前代码。当我运行时,它生成错误“NoneType”对象没有属性“generate_elliptic_curve_private_key”
ecurve = asymmetric.ec.EllipticCurve
ecurve.name = 'secp256r1'
ecurve.key_size = 128
ec_backend = cryptography.hazmat.backends.interfaces.EllipticCurveBackend.generate_elliptic_curve_private_key(cryptography.hazmat.backends.interfaces.EllipticCurveBackend, ecurve)
key = asymmetric.ec.generate_private_key(curve=ecurve, backend=ec_backend)
Run Code Online (Sandbox Code Playgroud)
这是文档https://cryptography.io/en/latest/hazmat/primitives/asymmetric/ec/#
python ×12
cryptography ×5
openssl ×3
rsa ×3
aes ×2
encryption ×2
pycrypto ×2
pycryptodome ×2
pyopenssl ×2
python-3.x ×2
airflow ×1
docker ×1
m2crypto ×1
openssh ×1
pip ×1
pycharm ×1
sha256 ×1
ssl ×1