Làm cách nào để nhanh chóng mã hóa một tệp bằng AES?


81

Tôi muốn mã hóa một tập tin bằng AES-256. Làm thế nào tôi có thể làm điều đó một cách nhanh chóng và dễ dàng, và làm thế nào tôi có thể - hoặc người khác - mã hóa lại nó?

Câu trả lời:


86

Thật không may, không có giải pháp dễ dàng để đảm bảo công cụ của bạn. Hãy suy nghĩ về trường hợp sử dụng của bạn, có thể một cái gì đó khác với AES đơn giản là phù hợp hơn.


Nếu bạn muốn mã hóa độc lập nền tảng rất đơn giản, bạn có thể sử dụng openssl .

Xin lưu ý: Bạn có thể sử dụng điều này để ẩn sinh nhật-gift-idea.txt khỏi bạn cùng phòng của bạn, nhưng đừng hy vọng nó sẽ an toàn trước kẻ tấn công quyết tâm!

  1. Như đã chỉ ra trong các bình luận, phương pháp này sử dụng chức năng phái sinh khóa ngây thơ, vì vậy mật khẩu của bạn cần phải cực kỳ tốt để bạn có cơ hội được an toàn.
  2. Ngoài ra, phương pháp này không xác thực bản mã, có nghĩa là kẻ tấn công có thể sửa đổi hoặc làm hỏng nội dung mà bạn không nhận thấy.
  3. Đối với nhiều loại bảo mật, mã hóa đơn giản là không đủ (ví dụ: bạn không thể chỉ sử dụng mã hóa để liên lạc an toàn)

Nếu bạn vẫn muốn sử dụng openssl:

  • Mã hóa:

    openssl aes-256-cbc -in attack-plan.txt -out message.enc

  • Giải mã:

    openssl aes-256-cbc -d -in message.enc -out plain-text.txt

Bạn có thể nhận được openssl để mã hóa base64tin nhắn bằng cách sử dụng công -atắc trên cả mã hóa và giải mã. Bằng cách này, bạn có thể dán bản mã vào một thông điệp email chẳng hạn. Nó sẽ trông như thế này:

stefano:~$ openssl aes-256-cbc -in attack-plan.txt -a
enter aes-256-cbc encryption password:
Verifying - enter aes-256-cbc encryption password:
U2FsdGVkX192dXI7yHGs/4Ed+xEC3ejXFINKO6Hufnc=

Lưu ý rằng bạn có một sự lựa chọn về mật mã và phương thức hoạt động. Để sử dụng bình thường, tôi khuyên dùng aes 256 ở chế độ CBC. Đây là các chế độ mật mã bạn có sẵn (chỉ tính AES):

aes-128-cbc ← this is okay
aes-128-ecb
aes-192-cbc
aes-192-ecb
aes-256-cbc ← this is recommended
aes-256-ecb

Xem thêm:

Xin lưu ý:

OpenSSL sẽ hỏi bạn mật khẩu. Đây không phải là khóa mã hóa, nó không giới hạn ở 32 byte! Nếu bạn định chuyển tập tin với người khác, bí mật chung của bạn sẽ rất mạnh mẽ. Bạn có thể sử dụng trang này để hiểu mật khẩu của bạn tốt như thế nào:

Cảnh báo: Tôi đã kiểm tra rằng các trang web này không gửi mật khẩu của bạn đến máy chủ, nhưng điều đó có thể thay đổi bất cứ lúc nào. Sử dụng các trang web này với các công cụ / thanh tra dev và kiểm tra xem chúng có gửi gì trước khi nhập mật khẩu mạnh của bạn không.


9
openssl aes-256-cbcngắn hơn openssl enc -aes-256-cbcvà hoạt động quá. Trang hướng dẫn cho việc này có sẵn bằng cách chạy man enc. Không bao giờ sử dụng ecbcho dữ liệu không nên được tôi luyện, luôn luôn sử dụng cbc. -saltlà dư thừa vì nó mặc định. Nếu bạn bỏ qua -out filename, đầu ra sẽ được ghi vào đầu ra tiêu chuẩn, điều này rất hữu ích nếu bạn chỉ cần phân tích dữ liệu, nhưng không ghi nó vào đĩa. Lệnh tiếp theo hiển thị giới hạn dòng cho bản rõ : openssl aes-256-cbc -d -in filename | wc -l. (sử dụng khác, đọc tệp openssl aes-256-cbc -d -in filename | less:)
Lekensteyn

1
Tôi sử dụng gần như chính xác điều này trong một kịch bản: /usr/bin/openssl enc -aes-256-cbc -a -salt -in $1 -out ${1}.enc với điều ngược lại như bạn mong đợi.
belacqua

1
Không có lý do nào để thích AES 256 hơn AES 128. @Lekensteyn Không bao giờ sử dụng ECB cho dữ liệu bí mật - về cơ bản không nên sử dụng ECB (chỉ dành cho chuyên gia: Không bao giờ nên sử dụng ECB trừ một số trường hợp rất cụ thể). Tổng quát hơn, opensslcông cụ dòng lệnh chủ yếu là một bằng chứng để kiểm tra thư viện OpenSSL. Câu trả lời đúng cho câu hỏi này là GPG hoặc một số người lưu trữ, chẳng hạn như 7z .
Gilles

1
Tôi muốn thêm rằng openssl encthực sự không an toàn nếu bạn có mật khẩu yếu. Trước đây tôi đã khuyến nghị sử dụng một số openssl enc, nhưng bây giờ đề nghị sử dụng gpgthay vì sử dụng KDF theo cách tốt hơn. Xem câu trả lời này .
Lekensteyn

2
-1 Để khuyến nghị sử dụng OpenSSL cấp thấp. Nó không cung cấp bất kỳ chức năng HMAC nào và như @Lekensteyn chỉ ra, nó thiếu KDF thích hợp.
gertvdijk

26

Tôi thích sử dụng gpglệnh:

Mã hóa:

gpg --cipher-algo AES256 --symmetric filename.tar.gz

Tốc ký:

gpg --cipher-algo AES256 -c filename.tar.gz

Điều này sẽ yêu cầu một mật khẩu.

Giải mã:

gpg --output filename.tar.gz --decrypt filename.tar.gz.gpg

Tốc ký:

gpg -o filename.tar.gz -d filename.tar.gz.gpg

Bạn cũng có thể thêm cipher-algo AES256vào ~/.gnupg/gpg.confđể biến AES256 thành mặc định. (Theo manpage đó là CAST5 )


Bạn cũng có thể sử dụng AES(có nghĩa là AES-128). AES-128 nhanh hơn một chút và không kém an toàn.
Gilles

2
+1. Cũng lưu ý rằng GnuPG cũng cung cấp xác thực thư (HMAC) cho bạn khi sử dụng AES (mà OpenSSL thiếu là câu trả lời được đánh giá cao nhất tại thời điểm viết). Thông tin cơ bản: superuser.com/a/633716/157409
gertvdijk

Làm thế nào tôi có thể ngăn chặn gpglưu trữ mật khẩu?
dùng76284

16

7z (khi tùy chọn mật khẩu được sử dụng) sử dụng mã hóa AES 256 bit (với kéo dài khóa SHA256 ).

Cài đặt nó ( p7zip-full), nhấp chuột phải vào tệp hoặc thư mục bạn muốn mã hóa và chọn Nén , .7zcác tùy chọn / Mật khẩu khác .

nhập mô tả hình ảnh ở đây

Để giải mã, nhấp chuột phải vào tệp .7z và chọn Trích xuất tại đây .


1
Làm thế nào để bạn khởi chạy GUI cho 7z?
m0skit0

4

mã hóa

Trang web được liên kết chứa một công cụ mã hóa / giải mã aes 256-bit nguồn mở và là đa nền tảng - MacOs, Windows, Linux và các công cụ khác thông qua Java.

Mã hóa: aescrypt -e <file>

Giải mã: aescrypt -d <file>

Bạn có thể sao lưu và mã hóa thư mục nhà của mình bằng cú pháp:

tar -cvf - /home/<home_folder> | aescrypt -e -p <password_message> - > backup.tar.aes

cài đặt Ubuntu

Tải xuống và trích xuất nguồn

make
sudo make install

nền tảng khác

Tải về các tệp nhị phân hoặc mã nguồn từ trang web.


3

Rất nhiều lời đề nghị mà tôi đã đưa ra đã được đưa ra trong chủ đề này. Về cơ bản, openssl thực sự là cách dễ nhất để mã hóa một tập tin hoặc tập lệnh. Tuy nhiên, tôi sẽ thận trọng không sử dụng AES-256 chỉ vì nó không có sẵn trong tất cả các phiên bản openssl trên một số nền tảng. Hầu hết các hệ điều hành mới hơn ... tức là Linux có nó. Nhưng những người khác như AIX 5.3 thì không (tôi nghĩ HP-UX cũng vậy). Nếu bạn có ý định sử dụng tệp hoặc tập lệnh của mình trên các nền tảng khác nhau, tôi thực sự khuyên bạn nên sử dụng AES-128 vì điều này có sẵn ở mọi nơi.

Làm thế nào bạn có thể "nhanh chóng và dễ dàng" mã hóa một tệp bằng AES-128?

Một trang web như www.ShellScrypt.com sử dụng openssl AES-128 khá mãnh liệt để mã hóa tập lệnh shell và sau đó làm cho các bản sao được mã hóa của tập lệnh có thể thực thi được. Tất cả bạn phải làm là dán tập lệnh vào trang web và một tệp zip sẽ được tạo cho bạn. Tệp zip đó sẽ chứa phiên bản được mã hóa (và có thể thực thi được nếu là tập lệnh) của tệp của bạn. Điều này cho phép bạn " dễ dàng " và " thuận tiện " mã hóa tập tin / tập lệnh mà không phải đáp ứng bất kỳ yêu cầu gói hoặc mô-đun nào trên mọi hệ thống bạn định sử dụng tập lệnh trên hoặc chạy một số câu thần chú phức tạp và khó hiểu của các lệnh openssl.

Dưới đây là một cơ sở mã hóa / giải mã openssl lệnh sử dụng AES-128:

test@test-VirtualBox:~$ 
test@test-VirtualBox:~$ echo precious-content | openssl aes-128-cbc -a -salt -k mypassword
U2FsdGVkX1+K6tvItr9eEI4yC4nZPK8b6o4fc0DR/Vzh7HqpE96se8Fu/BhM314z
test@test-VirtualBox:~$
test@test-VirtualBox:~$ echo U2FsdGVkX1+K6tvItr9eEI4yC4nZPK8b6o4fc0DR/Vzh7HqpE96se8Fu/BhM314z | openssl aes-128-cbc -a -d -salt -k mypassword
precious-content
test@test-VirtualBox:~$ 
test@test-VirtualBox:~$

2
Chỉ cần để lại một bình luận để đưa ra một nhận xét rằng, shell shellscrypt.com đã bị tắt (hay còn gọi là trang web đã biến mất).
e-sushi

1

Thêm vào câu trả lời của Stefano Palazzo, tôi đã tạo ra một hàm bash nhỏ hoạt động tương tự như lệnh base64.

Nó sẽ aes256 mã hóa một tập tin, và sau đó base64 mã hóa nó. Khi thực hiện ngược lại, nó sẽ giải mã64, giải mã và sau đó nhổ bản gốc.

aes256() {
  decodeMe=""
  isPipe="$([ ! -t 0 ] && echo "true" || echo "false")"

  if [ "$1" = '-d' ] || [ "$1" = '--decode' ]; then
    decodeMe="-d"
    shift
  fi

  if [ "$isPipe" = "true" ]; then
    read input
    printf '%s\n' "$input" | openssl aes-256-cbc -a $decodeMe
    exitCode="$?"
  else
    openssl aes-256-cbc -a $decodeMe -in "$*"
    exitCode="$?"
  fi

  unset isPipe decodeMe input
  return "$exitCode"
}

Sử dụng:

echo "my string" | aes256
# enter aes-256-cbc encryption password
# Returns: U2FsdGVkX1++e/BhBGlNOzNvarqq7zI13S/hbiKVzXQ=

echo "U2FsdGVkX1++e/BhBGlNOzNvarqq7zI13S/hbiKVzXQ=" | aes256 -d
# enter aes-256-cbc decryption password
# Returns: my string

aes256 file.plain > file.crypt
# enter aes-256-cbc encryption password

aes256 -d file.crypt
# enter aes-256-cbc decryption password
# Spits out original unencrypted file.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.