TCL과 openssl 간의 암호화 호환성

TCL과 openssl 간의 암호화 호환성

암호화 메커니즘을 사용하는 쉘 스크립트와 tcl 스크립트가 있고 두 스크립트 모두에서 동일한 암호 출력을 원합니다.

예를 들어, tcl 스크립트와 쉘 스크립트의 출력 암호는 동일해야 합니다. 제가 사용하려는 암호화 메커니즘은 AES 또는 DES입니다. (사실 저는 어떤 암호화 메커니즘이라도 사용하는 데 개방적입니다.)

문제는 두 스크립트가 서로 다른 암호 텍스트를 생성한다는 것입니다.

tcl에서는 다음 명령을 사용하고 있습니다.

[aes::aes -mode cbc -dir encrypt -key 1234567891012345 hi]

그리고 쉘 스크립트에서:

echo -n "hi" | openssl enc -aes-128-cbc -nosalt -pass pass:1234567891012345

나는 두 명령의 결과가 동일할 것이라고 가정했지만 그렇지 않습니다. 명령이 두 번 실행되면 쉘 스크립트에서 동일한 암호가 생성되도록 솔트 옵션을 사용하지 않습니다.

다른 스크립트를 사용하여 동일한 암호 텍스트를 얻을 수 있는 방법이 있습니까?

답변1

암호를 사용하도록 지시하면 openssl enc항상 KDF를 통해 제공되며 키로 직접 사용되지 않습니다. 사용해 -nosalt도 이 기능이 비활성화되지는 않습니다. ( openssl enc -p옵션을 사용하면 실제로 어떤 키와 IV가 사용되고 있는지 확인할 수 있습니다.)원시 키를 지정하려면 -K옵션이 필요합니다.

( openssl enc -K가치는 다음과 같을 것으로 예상됩니다.16진수로,그 사이에는 aes::aes -key원시 이진 데이터로 해석됩니다.)

또 다른 문제는 패딩입니다. AES는 블록암호이므로모든 입력 데이터를 채워야 합니다.16바이트의 배수(AES 블록 크기)로 확장되며 보안 속성이 다른 여러 패딩 방법이 있습니다. Tcl aes모듈은 간단한 제로 패딩을 사용하여 데이터를 0x00바이트로 확장합니다.

한편 OpenSSL은 PKCS#7 패딩을 사용하고 패드 크기와 일치하는 값으로 블록을 채웁니다. 예를 들어 입력이 2바이트인 경우 14바이트의 패딩이 필요하므로 PKCS#7에 따르면 모든 패드 바이트의 값도 14(0x0E)입니다.

( man enc8바이트 블록에 대해서만 패딩 체계를 정의하는 오래된 문서인 PKCS#5에 대해 말합니다. PKCS#7은 나중에 정확히 동일한 체계를 정의했습니다.모든 블록 크기에 대해.)

CBC 모드의 경우 다음도 필요합니다.IV를 지정(16바이트, AES 블록 크기와 동일) Tcl 모듈은 기본적으로 모두 0인 IV를 사용합니다. CBC는 두 번째 및 이후 블록에만 IV를 사용하므로 짧은 텍스트의 출력에는 영향을 미치지 않습니다.

결론적으로, 이는 동일한 결과를 제공합니다(제로 패딩 사용).

aes::aes -mode cbc -dir encrypt -key 1234567891012345 -hex "hi"

printf 'hi\0\0\0\0\0\0\0\0\0\0\0\0\0\0' \
  | openssl enc -aes-128-cbc -nopad \
    -K 31323334353637383931303132333435 \
    -iv 00000000000000000000000000000000 \
  | hexdump -C

이것도 마찬가지입니다(PKCS#7 패딩 사용).

aes::aes -mode cbc -dir encrypt -key 1234567891012345 -hex \
         "hi\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e"

printf 'hi' \
  | openssl enc -aes-128-cbc \
    -K 31323334353637383931303132333435 \
    -iv 00000000000000000000000000000000 \
  | hexdump -C

패딩을 구현하려면:

set data "hi"
set pad [expr {16 - ([string length $data] % 16)}]
append data [string repeat [format %c $pad] $pad]
aes::aes -mode cbc -dir encrypt -key 1234567891012345 -hex $data

관련 정보