【发布时间】:2021-05-16 01:22:15
【问题描述】:
您好,我想将这个 python 代码传递给 php,但我不知道如何,所以任何人都可以帮助我或解释一下吗?
这是我用python写的代码。
蟒蛇
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.asymmetric import rsa, padding
from cryptography.hazmat.primitives.ciphers.aead import AESCCM
def dec_public_key():
backend = default_backend()
#
e = int("103....", 16)
n = int("DASCGFWQFCA13......", 16)
public_number = rsa.RSAPublicNumbers(e, n)
return backend.load_rsa_public_numbers(public_number)
def enc_public_key(public_key, text):
# here i have some questions, php have PKCS1v15?
return public_key.encrypt(text, padding.PKCS1v15())
def aes_key():
# ---
return AESCCM.generate_key(256)
def nc():
# random bytes
return urandom(12)
def encrypt_aes_key(aes_key, nc, text):
# ..
cipher = AESCCM(aes_key, tag_length=8)
return cipher.encrypt(nc, text, None)
php
这是 php 中的代码,但其余部分我不知道......
<?php
function nc() {
// here generate a random bytes
return random_bytes(12);
}
function aes_key() {
# this function generate a random bytes base 256 lenght with the algo aes-256-ccm
return random_bytes(openssl_cipher_iv_length("aes-256-ccm"));
}
function dec_public_key() {
......?
}
function enc_public_key(public_key, text) {
......?
}
function encrypt_aes_key(aes_key, nc, text) {
......?
}
【问题讨论】:
-
据我所见,您在 Python 端有混合加密(GCM 模式下的 AES 用于数据加密和 RSA 加密,PKCS1.5 填充用于密钥加密)。两者都可通过 PHP 内置的 OpenSSL 支持获得。在您的公钥上只有一个注释:您以“模数”和“指数”形式拥有它,但 PHP/OpenSSL 只接受 PEM 编码的密钥,因此只需要对其进行转换。请注意,您的问题在 Stackoverflow 上过于宽泛,无法获得“完整”答案。
-
phpseclib 支持在给定模数和指数的情况下导入公钥,但不支持 CCM。 openssl 反过来支持 CCM,但不从模数和指数导入密钥。如果你可以应用 GCM 而不是 CCM,phpseclib 可能是最方便的方法。否则 openssl,而公钥必须事先在外部转换为 X.509/SPKI 格式。
标签: python php python-3.x cryptography