Tạo cặp khóa RSA 2048: thông qua openssl 0,5s qua gpg 30s, tại sao lại có sự khác biệt?


9

Tạo cặp khóa RSA 2048: thông qua openssl 0,5s qua gpg 30s, tại sao sự khác biệt Có một số chương trình có thể điều chỉnh các khóa bàn phím công khai / riêng tư RSA

Chẳng hạn, GnuPG / OpenPGP có một wizzard được ghen tị thông qua

gpg --gen-key

OpenSSL có thể tạo ra một cặp khóa bằng cách sử dụng các dòng lệnh này

openssl genrsa -out testkey.private 2048
openssl rsa -in testkey.private -pubout -out testkey.public

đối với cùng một điều, đó là tạo ra một khóa RSA 2048, tôi có thể cảm nhận được - trên cùng một cỗ máy - những thời điểm rất khác nhau.

openssltạo ra một cặp khóa trong khoảng 0,5 giây
gpgmất khoảng 30 và thậm chí quảng cáo "di chuyển chuột để tạo ngẫu nhiên / entropy"

Sự khác biệt có thể được giải thích? Tôi biết rằng gpg thực hiện một số bước nhỏ hơn sau đó chỉ là tạo khóa RSA, nhưng tôi đặc biệt chọn tùy chọn (4)

Vui lòng chọn loại khóa bạn muốn:
   (1) RSA và RSA (mặc định)
   (2) DSA và Elgamal
   (3) DSA (chỉ ký)
   (4) RSA (chỉ ký)
Lựa chọn của bạn?

Do đó, thứ thực sự duy nhất được tạo ra là một cặp khóa RSA 2048bit. Tuy nhiên, sự khác biệt thời gian là 30 giây?

Đối với tôi, có vẻ như gpg đang lãng phí thời gian một cách không cần thiết hoặc OpenSSL không chờ đủ thời gian và do đó tạo ra các khóa không an toàn.

Câu hỏi của tôi là những gì có thể giải thích sự khác biệt?

Cập nhật

Việc tạo RSA phải lấy một số ngẫu nhiên đầu vào. Do đó để chắc chắn rằng openssl nhanh chóng không chỉ đơn giản là kết quả của việc sử dụng một số ngẫu nhiên được lưu trữ, tôi đã xử lý nó nhiều lần

thời gian bash -c "cho i trong {1..50}; do openssl genrsa -out / dev / null 2048; xong;"

mang lại

số 0m16.577 thật
người dùng 0m16.309s
sys 0m0.092s

đó là với 50 khóa RSA 20 20 bit (tôi giả sử cần nhiều entropy / ngẫu nhiên) openssl vẫn chỉ cần 16 giây. Do đó, giả định của tôi ở đây sẽ là "câu trả lời" mà openssl phải bị phá vỡ. Sau tất cả, tôi không tin tưởng Linux của mình (hạt nhân 3.2.0-59) đã trở nên rất tuyệt vời trong việc tạo ra sự ngẫu nhiên.

Có lẽ sự khác biệt chỉ đơn giản là sử dụng openssl /dev/urandomvà sử dụng gpg /dev/randommà nếu đúng có thể giải thích sự khác biệt về thời gian thì vấn đề của tôi là tôi không biết làm thế nào tôi sẽ tìm hiểu về điều này, để xác minh điều này.

cập nhật2

Để kiểm tra nguồn ngẫu nhiên của openssl tôi đã sử dụng

strace -xe theo dõi = tập tin, đọc, viết, đóng openssl genrsa -out testkey5.private 2048 2> & 1 | grep ngẫu nhiên -A1

mang lại

mở ("/ dev / urandom", O_RDONLY | O_NOCTTY | O_NONBLOCK) = 4
đọc (4, "\ x21 \ xd8 \ xaa \ xf1 \ x2b \ x5f \ x4a \ x89 \ x5d \ x6c \ x58 \ x82 \ xc1 \ x88 \ x21 \ x04 \ xfa \ x5b \ x18 \ x x2b \ xe3 \ xf3 \ xc0 \ xb1 \ xef \ xfb \ x44 \ x15 \ x09 ", 32) = 32

do đó, có vẻ như 32 byte từ /dev/urandom(không phải là "tốt hơn" /dev/random) là đủ cho khóa RSA 2048bit trong openssl. Do đó nó rất nhanh!

Đo

Thế hệ khóa đôi RSA 2048bit có nghĩa là

  • 32 byte chỉ /dev/urandom(sử dụng openssl)
  • 300 byte của /dev/random(sử dụng openPGP GNU Privacy Guard)

Điều này tất nhiên giải thích sự khác biệt thời gian!

Câu trả lời:


10

GnuPG tiêu thụ một vài byte từ /dev/randommỗi byte ngẫu nhiên mà nó thực sự sử dụng. Bạn có thể dễ dàng kiểm tra xem với lệnh này:

start cmd:> strace -e trace=open,read gpg --armor --gen-random 2 16 2>&1 | tail
open("/etc/gcrypt/rngseed", O_RDONLY)   = -1 ENOENT (No such file or directory)
open("/dev/urandom", O_RDONLY)          = 3
read(3, "\\\224F\33p\314j\235\7\200F9\306V\3108", 16) = 16
open("/dev/random", O_RDONLY)           = 4
read(4, "/\311\342\377...265\213I"..., 300) = 128
read(4, "\325\3\2161+1...302@\202"..., 172) = 128
read(4, "\5[\372l\16?\...6iY\363z"..., 44) = 44
open("/home/hl/.gnupg/random_seed", O_WRONLY|O_CREAT, 0600) = 5
cCVg2XuvdjzYiV0RE1uzGQ==
+++ exited with 0 +++

Để xuất 16 byte entropy chất lượng cao, GnuPG đọc 300 byte từ /dev/random.

Điều này được giải thích ở đây: Kiến trúc hệ thống con số ngẫu nhiên

Linux lưu trữ tối đa 4096 byte (xem cat /proc/sys/kernel/random/poolsize) entropy. Nếu một quá trình cần nhiều hơn khả dụng (xem cat /proc/sys/kernel/random/entropy_avail) thì việc sử dụng CPU sẽ ít nhiều không liên quan vì tốc độ cấp liệu của nhóm entropy của kernel trở thành yếu tố liên quan.


Ấn tượng. Cảm ơn sự sáng suốt của bạn. Tôi nghĩ rằng nó khai sáng khá nhiều về câu hỏi! Vì vậy, có vẻ như openssl hài lòng với 32byte chất lượng kém hơn /dev/urandomgpg thậm chí còn nói rằng "1 byte /dev/randomkhông đủ tốt cho 1 byte ngẫu nhiên". Điều này không có nghĩa là các khóa openssl dễ bị "quá ít ngẫu nhiên" so với gpg?
nhân

1
@humanityANDpeace Tính ngẫu nhiên là một cuộc thảo luận bất tận. Cách đây không lâu, "người dùng chính" của trang web này đã đưa ra tuyên bố /dev/urandomđủ tốt cho mục đích tiền điện tử. Trong danh sách gửi thư của GnuPG có lẽ anh ta sẽ bị cười vì điều đó. AFAIK không thể chứng minh rằng dữ liệu nhất định là hoàn toàn ngẫu nhiên. Bạn có thể tìm thấy sự không ngẫu nhiên nhưng chỉ nơi bạn tìm kiếm chính xác mẫu đó.
Hauke Laging

vâng tôi hiểu :) Tuy nhiên, thực tế là gpg sử dụng 300byte /dev/randomtrong khi openssl chỉ sử dụng 32byte /dev/urandomdường như gợi ý rủi ro bảo mật tiềm ẩn cho người dùng thận trọng về cách muốn khóa RSA 2048bit. Do đó tôi sẽ chọn gpg. 32byte dường như rất ít
nhân

2
@HaukeLaging Người dùng chính của người dùng, người dùng của trang web này đã nhận được lời khuyên này từ người dùng chính, người dùng về bảo mật thông tinmật mã , với lời giải thích hợp lý (không giống như tính toán kích thước nhóm entropy của Linux, không có). Là một rand từ / dev / urandom có ​​an toàn cho khóa đăng nhập không? "Câu trả lời ngắn gọn là có. Câu trả lời dài cũng có.
Gilles 'SO- ngừng trở thành ác quỷ'

2
32 byte được đọc từ CSPRNG được tạo mầm tốt sẽ cung cấp 256 bit bảo mật (là rất nhiều ). Khóa RSA-2048 chỉ cung cấp bảo mật khoảng 112 bit. Thuộc tính đáng ngờ duy nhất của a /dev/urandomlà (trên linux) nó không chặn trước khi nó được gieo trực tiếp sau khi khởi động. Một khi nó đã được gieo hạt, nó sẽ được bảo mật mãi mãi.
CodeInChaos

7

Ý kiến ​​của bạn rằng sự khác biệt này là do opensslsử dụng / dev / urandom và gpgsử dụng /dev/randomlà chính xác.

Bạn có thể xem entropy có sẵn đi xuống trong khi tạo khóa bằng gpgcách sử dụng:

watch -n 1 cat /proc/sys/kernel/random/entropy_avail

Tôi đã sử dụng một chương trình để tạo mô tả các bước để thiết lập thẻ thông minh OpenGPGgpg , vì vậy tôi phải chạy gpgnhiều lần cho đến khi tất cả đều hoạt động như dự định. Sau các lần chạy ban đầu, tôi nhận thấy rằng /dev/randomsẽ không có đủ entropy và gpg sẽ ngừng chờ đợi entropy mới được tích lũy.

Tôi đã viết một chương trình nhỏ để cung cấp thêm dữ liệu không ngẫu nhiên và khi làm như vậy gpgsẽ không "dừng lại" mà tạo ra các khóa gần như ngay lập tức: rất tốt để kiểm tra tập lệnh để chạy chính xác, nhưng tất nhiên không phải là điều bạn nên làm trong khi tạo thực tế của mình chìa khóa.

Chương trình tăng tốc gpg( không sử dụng trong các tình huống thực tế ):

# For testing purposes only 
# DO NOT USE THIS, tHIS DOES NOT PROVIDE ENTROPY TO /dev/random

import fcntl
import time
import struct

RNDADDENTROPY=0x40085203

while True:
    random = "3420348024823049823-984230942049832423l4j2l42j"
    t = struct.pack("ii32s", 8, 32, random)
    with open("/dev/random", mode='wb') as fp:
        # as fp has a method fileno(), you can pass it to ioctl
        res = fcntl.ioctl(fp, RNDADDENTROPY, t)
        time.sleep(0.001)

Khi tôi chạy nó trong khi xem, entropy_availtôi có thể thấy entropy có sẵn lên tới hơn 3800.


Cảm ơn câu trả lời. Tôi vẫn mong muốn được thử nghiệm gpg, điều không may là ít có thể thay đổi và tương tác nhiều hơn. .. Vẫn. Bạn có chắc rằng cuộc gọi lặp lại của catchính nó đã không thoát entropy? Bạn có một số bằng chứng hoặc nguồn cho biết sử dụng gpg /dev/randomsẽ hoàn thiện câu trả lời không? Cuối cùng, điều đó cũng có nghĩa là openssl tạo ra các khóa RSA chất lượng kém hơn gqg?
nhân

@humanityANDpeace Có thể (mặc dù ít rõ ràng hơn) để sử dụng GnuPG trong chế độ hàng loạt. Tìm kiếm Unattended key generationtrong tệp /usr/share/doc/packages/gpg2/DETAILS(hoặc bất cứ điều gì nó có thể có trong bản phân phối của bạn). Các /dev/randombằng chứng là trong câu trả lời của tôi.
Hauke ​​Laging

@humanityANDpeace Câu trả lời của Hauke ​​được nhiều người biết đến, nhưng tôi đã tìm thấy một số tài liệu tham khảo về nó trong khi nghiên cứu cách thiết lập thẻ OpenGPG của mình. Batching là không tầm thường, nhưng chương trình python tôi đã sử dụng tôi đã có sẵn trên bitbucket
Anthon

Tôi thích cả hai câu trả lời và cả hai loại đề xuất giải pháp đúng. cảm ơn vì liên kết bitbucket!
nhân

1
Sinh ra một quy trình mới tiêu thụ entropy, do đó, một cách tiếp cận tốt hơn sẽ là sử dụng phần readmềm dựng sẵn:while read -r < /proc/sys/kernel/random/entropy_avail; do clear; date; printf '\nAvailable entropy: %s bytes\n' "$REPLY"; sleep 1; done
nyuszika7h
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.