이것이 올바른 커뮤니티가 아니라면 사과드립니다.
RC2 암호를 사용하여 암호화된 문자열이 있습니다. 키와 IV를 알고 있지만 OpenSSL을 사용하여 해독하는 데 문제가 있습니다. 나는 일반 텍스트가 무엇인지 알고 있습니다.
$ echo MY_CIPHER_TEXT | openssl enc -d -base64 -rc2 -iv MY_IV
복호화 비밀번호를 입력했는데 항상 답장이 옵니다
bad magic number
나는 이것이 openssl이 MY_CIPHER_TEXT를 암호화된 텍스트로 인식하지 못한다는 것을 의미한다고 생각하지만 그 이유를 이해하는 데 어려움을 겪고 있습니다.
"Bad Magic Number" 응답을 받는 이유를 설명할 수 있는 사람이 있습니까?
MY_CIPHER_TEXT = nKZQD6RKk9ozeGV5WOMVL9TDZTgg9mOZjDpBDqIocR8OGC+WcB4xAwDx7XTaJNv9v+Y3sEzNphtET6sXxBd0e/0Oh6g2d0LrKls2BFHGbaMynEVW2xy4xLP40se55zdawVLGImSxgiBtf9unfIJYN4EpdPlMiiB2TuvyEoUUtqQ=
MY_VI = jqn76XOl4To=
답변1
단순히 RC2 알고리즘을 아는 것만으로는 충분하지 않으며 RC2 알고리즘도 알아야 합니다. 당신도 일치해야합니다작동 모드특정 패턴에 대한 패딩 구성표. OpenSSL 명령줄(및 대부분의 EVP API)은 기본적으로 CBC 모드와 "PKCS5"(기술적으로는 PKCS7) 패딩으로 설정되어 있으며 이는 정확할 수도 있고 아닐 수도 있습니다.
openssl enc
기본적으로비밀번호 기반암호화 및 복호화, 즉 실제 키그리고 4개(IV가 없는 ECB 제외) 비밀번호로 사용되는 것은해싱 프로세스를 통해 파생됨PBKDF(암호 기반 키 파생 함수)라고 하며, 사용자가 제공하는 모든 인수는 -iv
무시됩니다. 이는 어쨌든 사용자가 제공한 인수가 유효하지 않기 때문에 좋습니다. 아래를 참조하세요. OpenSSL PBKDF(다른 더 나은 것들과 마찬가지로)는 OpenSSL 특정 형식으로 암호문의 시작 부분에 저장되어야 하는 임의의 "salt"를 사용하며, 이 salt가 없으면 오류 메시지가 발생합니다 bad magic number
. 자세한 내용은 다음을 참조하세요.https://crypto.stackexchange.com/questions/3298/is-there-a-standard-for-openssl-interoperable-aes-encryption/35614#35614.
키(비밀번호 아님)와 IV가 있으므로 둘 다 다음으로 변환하십시오.16진수(base64 아님) 다음을 사용하십시오.
openssl enc -base64 -d -rc2[-mode] -K $key_in_hex -iv $iv_in_hex
# note that's -K uppercase not -k lowercase
# you can use -a as a synonym for -base64
# For a block mode like CBC if standard PKCS5/7 padding wasn't used
# add -nopad and handle the last few bytes manually as needed.
# If your input is more than 76 chars per line (as your Q showed)
# and OpenSSL version before 1.1.0 you also need -A (uppercase).
Base64를 16진수로 변환하는 방법은 여러 가지가 있지만 가장 편리한 방법은 다음과 같습니다.
somevar=$( echo some_base64 | openssl base64 -d | xxd -p )
# xxd -p outputs only the hex with no labels or ASCII etc
# and thus is suitable as an argument to openssl enc
# without any processing by tools like sed, tr, awk