AES-256-CCM을 사용하여 Python으로 암호화 된 텍스트를 PHP에서 해독하는 방법

아이 멘 데 라지

내가 파이썬 코드에서 한 일을 파이썬에서 AES-256-CCM사용하여 암호화 된 PHP에서 chiphertext를 해독하려고하는 메신저 cryptography.hazmat는 다음과 같습니다.

from cryptography.hazmat.primitives.ciphers.aead import AESCCM
from os import urandom
import base64

#Text To Encrypt
plaintext = bytes("message from python", encoding='utf-8')
#AES 256 Key Genrator
key = AESCCM.generate_key(256)
#Genrate Nonce
nonce= urandom(12)
#chipher 
cipher = AESCCM(key, tag_length=8)
#Encryption
ciphertext = cipher.encrypt(nonce, plaintext, None)

그런 다음 key, nonceciphertextbase64 로 변환합니다 .

key_b64 = base64.standard_b64encode(key)
ciphertext_b64 = base64.standard_b64encode(ciphertext)
nonce_b64 = base64.standard_b64encode(nonce)

내 예에서 나는이 결과를 얻었다

key = b'\xcb\x14\x96{,0(\x15\x86 \xda\xf8\x1b"i|M\xbd\xc5d\xe7\xa6I\xdf\x7f\xe11\xae\xe8\x8a\xb3j'
key_b64 = b'yxSWeywwKBWGINr4GyJpfE29xWTnpknff+ExruiKs2o='

nonce = b'\xc7f\xdc\xe3\xe4\x03>M\x9by\x92\x9d
nonce_b64 = b'x2bc4+QDPk2beZKd'

ciphertext = b'R\x9f\xe6D\\_\xdexC\x82\xf8\x8e\x9b;\x91\xc7OLo\xc2\t/\x8fV>G='
ciphertext_b64 = b'Up/mRFxf3nhDgviOmzuRx09Mb8IJL49WPkc9'

내 PHP 코드에서 base64 결과를 사용합니다.

<?php
$key_from_python = base64_decode('yxSWeywwKBWGINr4GyJpfE29xWTnpknff+ExruiKs2o=');

$ciphertext_from_python = base64_decode('ooGUzo0YiwKPs9+2wXySYEpdBNfSpyLUHm1M');

$nonce_from_python = base64_decode('Up/x2bc4+QDPk2beZKd');

$cipher = "aes-256-ccm";

if (in_array($cipher, openssl_get_cipher_methods())){
$ivlen = openssl_cipher_iv_length($cipher);
$iv = openssl_random_pseudo_bytes($ivlen);
$decrypted_mesage_from_pythom = 
openssl_decrypt($encrypted_from_python_,$cipher,$key_from_python,$options=0 , $iv, $tag);
echo $decrypted_mesage_from_pythom;
}

여기 http://php.babo.ist/#/en/function.openssl-encrypt.html에서 찾은 예제를 기반으로 하고 해독 프로세스가 아무것도 반환하지 않는 다른 예제를 찾을 수 없으며
실제로 나를 혼란스럽게하는 것은 다음과 같습니다.

  1. 우리는 파이썬 코드에서 암호화하기 위해 IV를 사용하지 않았지만 PHP에는 NULL이 아닌 IV가 필요합니다. 어떻게 해결할 수 있습니까?
  2. 무엇 $tagPHP에서 PHP 코드와 $ tag_lenght 모두 대표하는 파이썬 (암호 = AESCCM (키, tag_length = 8))?
  3. 해독 nonce에 내 PHP 코드에서 사용하는 방법이 필요한 경우 ?

이 작품을 얻는 방법? Python에서 암호화하고 PHP에서 동일한 chiphertext를 해독합니다.

참고 : 암호화에는 python을, 암호 해독에는 php를 사용해야하며 AES-CCM을 사용해야합니다. 파이썬 코드가 수정되었습니다. 이해해 주셔서 감사합니다.

감사합니다

토 파코

12잘못된 암호문 / 태그를 초래 하는 임시 바이트 길이 (OP에서 사용)에 대한 AES-CCM의 PHP 구현에 버그가있는 것 같습니다 . 그러나이 버그는 OP의 PHP 코드에있는 여러 결함으로 인해 숨겨져 있습니다. 따라서 이러한 결함을 먼저 수정해야합니다.

  • Python 및 PHP 구현은 Python 코드에서 암호문과 태그가 해당 순서로 연결된다는 점에서 다릅니다. 반면 PHP 코드에서는 암호문과 태그가 별도로 처리됩니다.
  • Python 코드의 임시 값은 PHP 코드의 IV에 해당합니다.
  • PHP 코드에서 OPENSSL_RAW_DATA암호문이 Base64 인코딩이 아닌 원시 데이터로 전달되면 플래그를 설정해야합니다.
  • nonce 및 ciphertext (+ 태그)의 값은 두 코드에서 다릅니다. 그러나 12 바이트 nonce에 대한 PHP 버그와 함께 12 바이트 nonce를 선택했기 때문에 수정은 의미가 없습니다. 아래를 참조하십시오. 즉, 성공적인 테스트를위한 전제 조건은 12 바이트와 같지 않은 nonce 크기입니다.

이러한 점을 고려한 PHP 구현은 다음과 같습니다.

<?php
// Data from Python code
$key_from_python = base64_decode('<Base64 encoded key from Python>');
$ciphertext_from_python = base64_decode('<Base64 encoded (ciphertext + tag) from Python>');
$nonce_from_python = base64_decode('<Base64 encoded nonce from Python>');
$cipher = 'aes-256-ccm';

// Separate ciphertext and tag
$tagLength = 8;
$ciphertext = substr($ciphertext_from_python, 0, -$tagLength);
$tag = substr($ciphertext_from_python, -$tagLength);

// Decrypt
if (in_array($cipher, openssl_get_cipher_methods())){
    $decrypted_mesage_from_pythom = openssl_decrypt($ciphertext, $cipher, $key_from_python, OPENSSL_RAW_DATA, $nonce_from_python, $tag);
    echo $decrypted_mesage_from_pythom;
}
?>

이 PHP 코드 를 사용하면 nonce의 길이가 12bytes와 같지 않는 한 Python 코드에서 데이터를 해독 할 수 있습니다 .

Python 및 PHP 구현은 길이 713바이트 (둘 다 포함) 인 임시 값 s를 허용합니다. 여기 파이썬 . 12바이트 임시 값 문제와 관련하여 다음과 같은 결과가 나타납니다. PHP 코드 에서 마지막 바이트 를 제거하여 12바이트 임시 값이 바이트로 잘 리면 동일한 암호문 / 태그가 생성됩니다. 다음 PHP 코드는 태그 길이 바이트 (PHP 버전 7.4.4)에 대해이를 설명합니다.75816

<?php
function printCiphertextTag($plaintext, $key, $iv, $taglength){
    $encrypted = openssl_encrypt($plaintext, "aes-256-ccm", $key, OPENSSL_RAW_DATA, $iv, $tag, NULL, $taglength);
    echo sprintf("tag size: %2s, IV size: %2s, IV (hex): %-' 24s, ciphertext (hex): %s, tag (hex): %s\n", $taglength, strlen($iv), bin2hex($iv), bin2hex($encrypted), bin2hex($tag));
}

$plaintext = 'message from python'; 
$key = '01234567890123456789012345678901';
$nonce12 = openssl_random_pseudo_bytes(12);
$nonce7 = substr($nonce12, 0, 7);

printCiphertextTag($plaintext, $key, $iv = $nonce12, $taglength = 8);
printCiphertextTag($plaintext, $key, $iv = $nonce7, $taglength = 8);

printCiphertextTag($plaintext, $key, $iv = $nonce12, $taglength = 16);
printCiphertextTag($plaintext, $key, $iv = $nonce7, $taglength = 16);
?> 

이 결과는 PHP 구현의 버그를 나타냅니다.

대조적으로 Python 코드 12는 PHP 코드와 비교하여 바이트 임시 값에 대해 다른 암호문 / 태그를 생성 합니다 (이것이 12바이트 임시 값 을 사용하는 (수정 된) OP의 PHP 코드가 실패 하는 이유입니다 ). 동일한 매개 변수를 사용하여 Java / BC로 검사 하면 Python 코드 와 동일한 바이트 임시 값에 대해 동일한 암호문 / 태그가 생성되며 12, 이는 Python 코드의 값을 확인하고 다시 PHP 구현의 버그를 나타냅니다.

편집 : https://bugs.php.net/bug.php?id=79601 여기에 문제를 제출했습니다 . 참고 :이 문제는 관리자 비공개 로 설정 했기 때문에 적절한 권한 없이는 열 수 없습니다 (적어도 지금은). 여기 .

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

CryptoJ를 사용하여 AES256으로 암호화하는 올바른 방법을 수행하는 방법

분류에서Dev

Dart에서 AES CBC 256bit 및 PKCS5Padding을 사용하여 암호화 및 해독하고 매개 변수를 검색하는 방법

분류에서Dev

Delphi에서 AES-256 GCM으로 암호화하는 방법

분류에서Dev

sha256 해시를 키 crypto ++로 사용하여 AES를 사용하여 암호화하는 방법

분류에서Dev

AES로 JAVA로 암호화 된 javascript 파일을 해독하는 방법

분류에서Dev

NodeJS에서 aes-256-ecb를 사용하여 문자열을 올바르게 암호화하고 OpenSSL의 명령 줄로 해독하는 방법은 무엇입니까?

분류에서Dev

Vault에서 생성 된 AES256-GCM96 암호 텍스트를 프로그래밍 방식으로 해독하고 Vault 키를 내보내는 방법은 무엇입니까?

분류에서Dev

Android에서 256 비트 AES 암호화를 사용하는 방법

분류에서Dev

자바에서 AES256의 C #에서 암호화 및 암호 해독 중에 않고 BadPaddingException를 처리하는 방법

분류에서Dev

AngularJS 및 PHP Framework를 사용하여 업로드 된 파일을 폴더에 쉽게 암호화 및 해독하는 방법

분류에서Dev

AES 암호화에서 임의 임시 값으로 해독하는 방법

분류에서Dev

PHP에서 암호화 된 메시지를 해독하는 CryptoJS AES openssl_encrypt

분류에서Dev

phpseclib로 암호화하고 AES 알고리즘을 사용하여 Java로 해독하는 방법

분류에서Dev

Objective C에서 md5를 키로 두 배로 사용하여 AES256 암호화를 수행하는 방법은 무엇입니까?

분류에서Dev

AES-256에서 암호 복구 암호화되지 않은 파일을 통해 암호화 된 Zip 아카이브를 압축 하시겠습니까?

분류에서Dev

Java에서 C # 암호화 AES 문자열을 해독하는 방법

분류에서Dev

Elixir에서 AES CBC 128로 암호화 및 해독하는 방법

분류에서Dev

Crypto ++에서 RSA OAEP SHA-256을 사용하여 데이터를 암호화 / 복호화하는 방법

분류에서Dev

OpenSSL AES 256 CBC로 서버 측에서 암호화 된 파일을 해독 할 수 없습니다.

분류에서Dev

node.js를 사용하여 php / mcrypt로 생성 된 AES-ECB 암호문에서 해독

분류에서Dev

사용자 암호와 소유자 암호로 암호화 된 경우 사용자 암호로 Java에서 128 비트 RC4 pdf 파일을 해독하는 방법

분류에서Dev

매번 다른 암호화 된 텍스트를 반환하는 AES 암호화 방법

분류에서Dev

Objective-C로 암호화하고 MCRYPT_RIJNDAEL_256 MCRYPT_MODE_ECB를 사용하여 PHP에서 해독

분류에서Dev

PyCrypto로 OpenSSL과 같은 AES-256을 사용하여 암호화

분류에서Dev

pycrytodome 암호화 및 해독 된 텍스트를 문자열로 변환하는 방법

분류에서Dev

초기화 벡터를 조작한다고해서 AES 암호문을 해독하는 것을 (실제로) 방해하지는 않습니다.

분류에서Dev

OpenSSL을 사용하여 암호화 된 개인 키를 해독하는 방법은 무엇입니까?

분류에서Dev

Dart로 AES 256 CBC를 해독하는 방법

분류에서Dev

Node.js Crypto aes256 Cipher를 암호화-복호화하는 방법

Related 관련 기사

  1. 1

    CryptoJ를 사용하여 AES256으로 암호화하는 올바른 방법을 수행하는 방법

  2. 2

    Dart에서 AES CBC 256bit 및 PKCS5Padding을 사용하여 암호화 및 해독하고 매개 변수를 검색하는 방법

  3. 3

    Delphi에서 AES-256 GCM으로 암호화하는 방법

  4. 4

    sha256 해시를 키 crypto ++로 사용하여 AES를 사용하여 암호화하는 방법

  5. 5

    AES로 JAVA로 암호화 된 javascript 파일을 해독하는 방법

  6. 6

    NodeJS에서 aes-256-ecb를 사용하여 문자열을 올바르게 암호화하고 OpenSSL의 명령 줄로 해독하는 방법은 무엇입니까?

  7. 7

    Vault에서 생성 된 AES256-GCM96 암호 텍스트를 프로그래밍 방식으로 해독하고 Vault 키를 내보내는 방법은 무엇입니까?

  8. 8

    Android에서 256 비트 AES 암호화를 사용하는 방법

  9. 9

    자바에서 AES256의 C #에서 암호화 및 암호 해독 중에 않고 BadPaddingException를 처리하는 방법

  10. 10

    AngularJS 및 PHP Framework를 사용하여 업로드 된 파일을 폴더에 쉽게 암호화 및 해독하는 방법

  11. 11

    AES 암호화에서 임의 임시 값으로 해독하는 방법

  12. 12

    PHP에서 암호화 된 메시지를 해독하는 CryptoJS AES openssl_encrypt

  13. 13

    phpseclib로 암호화하고 AES 알고리즘을 사용하여 Java로 해독하는 방법

  14. 14

    Objective C에서 md5를 키로 두 배로 사용하여 AES256 암호화를 수행하는 방법은 무엇입니까?

  15. 15

    AES-256에서 암호 복구 암호화되지 않은 파일을 통해 암호화 된 Zip 아카이브를 압축 하시겠습니까?

  16. 16

    Java에서 C # 암호화 AES 문자열을 해독하는 방법

  17. 17

    Elixir에서 AES CBC 128로 암호화 및 해독하는 방법

  18. 18

    Crypto ++에서 RSA OAEP SHA-256을 사용하여 데이터를 암호화 / 복호화하는 방법

  19. 19

    OpenSSL AES 256 CBC로 서버 측에서 암호화 된 파일을 해독 할 수 없습니다.

  20. 20

    node.js를 사용하여 php / mcrypt로 생성 된 AES-ECB 암호문에서 해독

  21. 21

    사용자 암호와 소유자 암호로 암호화 된 경우 사용자 암호로 Java에서 128 비트 RC4 pdf 파일을 해독하는 방법

  22. 22

    매번 다른 암호화 된 텍스트를 반환하는 AES 암호화 방법

  23. 23

    Objective-C로 암호화하고 MCRYPT_RIJNDAEL_256 MCRYPT_MODE_ECB를 사용하여 PHP에서 해독

  24. 24

    PyCrypto로 OpenSSL과 같은 AES-256을 사용하여 암호화

  25. 25

    pycrytodome 암호화 및 해독 된 텍스트를 문자열로 변환하는 방법

  26. 26

    초기화 벡터를 조작한다고해서 AES 암호문을 해독하는 것을 (실제로) 방해하지는 않습니다.

  27. 27

    OpenSSL을 사용하여 암호화 된 개인 키를 해독하는 방법은 무엇입니까?

  28. 28

    Dart로 AES 256 CBC를 해독하는 방법

  29. 29

    Node.js Crypto aes256 Cipher를 암호화-복호화하는 방법

뜨겁다태그

보관