Điểm:1

Làm cách nào để lặp lại một cách an toàn và ngẫu nhiên một khóa có nguồn gốc từ Scrypt?

lá cờ de

Tôi đang phát triển một cách để tạo khóa riêng một cách xác định cho các đường cong elip tùy ý dựa trên một số thông tin đầu vào của người dùng (ví não). Hiện tại, tôi đang sử dụng thuật toán băm mật khẩu Scrypt với các tham số độ khó mạnh mẽ để băm một số tham số đầu vào thành một khóa.

Đầu ra của Scrypt phải được phân phối đồng đều giữa các $[0, 2^{b})$ ở đâu ${b}$ là số bit đầu ra được sử dụng từ đầu ra thuật toán Scrypt. Nhưng các khóa riêng của đường cong elip hợp lệ phải nhỏ hơn thứ tự trường hữu hạn của đường cong $N$, phân bổ đều cho $[0, N)$. Do đó, sử dụng đầu ra của Scrypt trực tiếp làm mod khóa riêng $N$ sẽ tạo ra một sai lệch nhỏ trong các khóa kết quả được tạo - tin xấu, vì vậy tôi cần tránh điều đó.

Thông thường, nếu bạn đang tạo khóa riêng bằng RNG an toàn, bạn chỉ cần thử lại RNG cho đến khi bạn nhận được một số nhỏ hơn $N$và bạn có thể sử dụng nó làm khóa riêng một cách an toàn.

Có cách nào an toàn để lặp lại một cách xác định đầu ra của Scrypt, sao cho chúng tôi duy trì phân phối giả ngẫu nhiên của đầu ra của Scrypt mà không phải chạy lại Scrypt với các tham số mới không?

Một cách mà tôi cân nhắc là băm đầu ra của scrypt bằng SHA256 hoặc SHA512 cho đến khi nó nhỏ hơn $N$, nhưng điều này sẽ không hoạt động tốt đối với các đường cong lớn hơn 512 bit, chẳng hạn như P521.

Một giải pháp kém thanh lịch khác là chỉ cần từ chối bất kỳ tham số đầu vào nào tạo ra khóa lớn hơn $N$. Nó rất hiếm khi xảy ra, vì vậy có lẽ tôi có thể thoát khỏi nó? Có bất kỳ đường cong phổ biến nào ngoài đó có thứ tự $N$ không phải là một phần đáng kể của sức mạnh cao nhất tiếp theo của nó là hai?

Điểm:1
lá cờ my

Do đó, sử dụng đầu ra của Scrypt trực tiếp làm khóa riêng $\bmod N$ sẽ tạo ra một sai lệch nhỏ trong các khóa kết quả được tạo - tin xấu, vì vậy tôi cần tránh điều đó.

Trên thực tế, sự thiên vị sẽ không đủ lớn để có thể khai thác được; tuy nhiên, giả sử rằng bạn muốn tránh điều đó hoàn toàn ...

Có cách nào an toàn để lặp lại một cách xác định đầu ra của Scrypt, sao cho chúng tôi duy trì phân phối giả ngẫu nhiên của đầu ra của Scrypt mà không phải chạy lại Scrypt với các tham số mới không?

Hai cách tiếp cận rõ ràng:

  • Có Scrypt tạo (giả sử) $log_2 N + 128$ bit, và đánh giá rằng $\bmod N$; sự thiên vị kết quả sẽ rất nhỏ, nó sẽ không thể đo lường được, ít khả năng khai thác hơn nhiều

  • Chuyển đầu ra của Scrypt tới LẮC; sau đó vắt ra $\lceil log_2 N \rceil$ bit (có thể là số byte chẵn, nếu nó làm cho việc triển khai đơn giản hơn) và nếu giá trị mà nó trả về lớn hơn $N$, vắt ra nhiều bit hơn.

Thứ hai là tương tự như ý tưởng của bạn với SHA256 hoặc SHA512; tuy nhiên vì SHAKE cho phép chúng tôi loại bỏ bao nhiêu bit tùy thích, nên chúng tôi có thể dễ dàng mở rộng điều đó để xử lý P521.

Ồ, và kể từ khi bạn hỏi:

Có bất kỳ đường cong phổ biến nào ngoài đó có thứ tự $N$ không phải là một phần đáng kể của sức mạnh cao nhất tiếp theo của nó là hai?

Vâng, các não bộ tôi nghĩ đến những đường cong - Tôi không biết rằng việc sử dụng chúng rất phổ biến; tuy nhiên tôi tin rằng chúng thỉnh thoảng được sử dụng.

Gilles 'SO- stop being evil' avatar
lá cờ cn
FIPS 186-4 §B.4 cho phép cả hai cách tiếp cận, với một quy trình cụ thể trong từng trường hợp. Nó chỉ yêu cầu 64 bit bổ sung cho cách tiếp cận sai lệch không đáng kể kích thước đầu vào cố định.
JoeJafarTheJenie avatar
lá cờ de
Ồ, tuyệt vời! Tôi không biết về băm SHAKE cho đến khi đọc câu trả lời của bạn. Đây thực sự là một giải pháp rất sạch (mặc dù không bị ràng buộc). Cảm ơn về mẹo về brainpool, thứ tự đường cong của họ thực sự trông khá khó chịu. Rất muốn biết thêm về lý do tại sao việc thêm các bit đầu ra mã hóa bổ sung sẽ làm giảm độ lệch
Điểm:0
lá cờ cn

Đầu tiên, việc sử dụng khóa riêng được xác định rõ ràng từ mật khẩu hầu như luôn sai.Mật khẩu thường bị xâm phạm hoặc quên và do đó cần phải thay đổi. Nếu việc thay đổi mật khẩu yêu cầu nhiều hơn là cập nhật một lượng nhỏ dữ liệu ở một nơi, thì bạn sẽ gặp khó khăn lớn khi vận hành. Vì vậy, thông thường, điều duy nhất bạn nên làm với khóa bắt nguồn từ mật khẩu là gói chìa khóa, tức là khóa có nguồn gốc từ mật khẩu chỉ được sử dụng để mã hóa đối xứng một tệp chứa các khóa ârealâ. Các khóa thực đó được lưu trữ và chúng không được tạo một cách xác định từ bất kỳ thứ gì, chúng chỉ được tạo ngẫu nhiên. Khi người dùng cập nhật mật khẩu, hãy mã hóa lại tệp đó bằng khóa dẫn xuất mật khẩu mới và xóa phiên bản trước đó.

Điều đó đang được nói, để xác định được một khóa đường cong elip, bước đầu tiên là xem xét loại đường cong.

  • Đối với Curve25519 và Curve448, các khóa được tính toán từ một chuỗi bit cố định được phân phối đồng đều như được chỉ định trong RFCÂ 7748 §5. Có một quy trình chính xác lấy đầu vào được phân phối đồng đều 256-bit hoặc 448-bit, buộc một số bit nhất định, diễn giải các bit dưới dạng số (Little-endian) và giảm thành modulo đại diện chính tắc $p$. Bởi vì $p$ cực kỳ gần với sức mạnh tiếp theo của $2$, việc giảm modulo khiến số không thay đổi với xác suất áp đảo. Việc triển khai Curve25519/Curve448 thường (âMUSTâ) chấp nhận các khóa ở dạng không chính tắc, vì vậy bạn không phải làm bất kỳ điều gì khác ngoài việc cung cấp chuỗi 32 byte hoặc 56 byte được phân phối đồng đều.

  • Đối với Ed25519 và Ed448, khóa riêng tư được chỉ định trong RFC 8032 §5.1.5 và §5.2.5 dưới dạng chuỗi 32 byte hoặc 57 byte thống nhất tương ứng. Quá trình chữ ký bắt đầu bằng cách băm đầu vào này (được nối với các chuỗi khác) và sử dụng kết quả dưới dạng số nguyên.

  • Đối với các đường cong NIST và nói chung là các đường cong ở dạng Weierstrass, không có quy trình duy nhất được chấp nhận phổ biến để chuyển từ chuỗi bit sang khóa riêng. FIPS 186-4 §B.4 mô tả hai phương pháp khả thi để tạo khóa riêng tư từ đầu ra của bộ tạo ngẫu nhiên và các phương pháp này đều có thể áp dụng như nhau để lấy khóa riêng tư từ luồng bit phân bổ đồng đều thu được từ thuật toán dẫn xuất khóa đối xứng. Để lấy khóa riêng trên một đường cong có thứ tự $p$ là một $n$-bit số nguyên tố:

    1. (âCác bit ngẫu nhiên bổ sungâ) Lấy $n + 64$ bit của đầu vào bí mật ((giả) ngẫu nhiên) được phân phối đồng đều. Giải thích đầu vào đó dưới dạng số nguyên lớn về cuối, rút ​​gọn nó theo modulo $p-1$ và thêm $1$ để có được một số trong phạm vi $[1, tr-1]$. Một số khóa có khả năng cao hơn một chút so với những khóa khác, nhưng vì độ lệch là khoảng $2^{-64}$, nó không mang lại lợi thế thực tế nào cho đối thủ.
    2. (âThí nghiệm viênâ) Lấy $n$ bit của đầu vào bí mật ((giả) ngẫu nhiên) được phân phối đồng đều. Diễn giải đầu vào đó dưới dạng số nguyên lớn về cuối. Nếu kết quả là $\ge p-1$, bắt đầu lại quá trình từ đầu. Nếu không thì thêm $1$. Điều này hoàn toàn không có sai lệch và không yêu cầu thao tác với các số lớn hơn $n$ bit, nhưng nó có nhược điểm là bạn không biết trước bạn sẽ cần bao nhiêu đầu vào được phân phối đồng đều: nó có khả năng không bị chặn.

    Phương pháp đầu tiên thường thuận tiện hơn vì bạn biết chính xác lượng đầu vào ngẫu nhiên (giả) là cần thiết.

Nếu bạn thực sự cần xâu chuỗi điều này bằng thuật toán dẫn xuất khóa dựa trên mật khẩu, chẳng hạn như scrypt, thì có hai phương pháp.

  • Phương pháp trực tiếp là yêu cầu bao nhiêu thông tin đầu vào mà bạn cần từ scrypt. Đối với các đường cong Weierstrass, điều này làm cho phương pháp thử nghiệm-ứng cử viên trở nên không thực tế. Vì vậy, hãy lấy 32 byte từ mã hóa cho Curve25519 hoặc Ed25519; 40 byte cho P256R1 hoặc P256K1; 56 byte cho P384R1 hoặc P384K1; 57 byte cho Ed448, v.v.
  • Phương pháp gián tiếp là yêu cầu một số bit cố định từ scrypt. Điều này cần phải đủ để không thể đoán được bằng vũ lực. 128 bit (16 byte) sẽ hoạt động tốt. Sử dụng điều này như một hạt giống cho một chức năng dẫn xuất khóa thông thường (không dựa trên mật khẩu), chẳng hạn như một từ NIST SPÂ 800-108 hoặc HKDFhoặc làm hạt giống cho thuật toán tạo giả ngẫu nhiên, chẳng hạn như một từ NIST SPÂ 800-90A. Sử dụng đầu ra PRNG đó để lấy khóa riêng.
JoeJafarTheJenie avatar
lá cờ de
Cám ơn vì cái này! Tôi biết các vấn đề cố hữu trong các khóa được tạo một cách xác định, nhưng đối với trường hợp sử dụng cụ thể của tôi, chúng không liên quan.
JoeJafarTheJenie avatar
lá cờ de
Giải pháp "thử nghiệm ứng viên" mà tôi nghĩ sẽ không hoạt động, vì điều đó có nghĩa là yêu cầu người dùng nhập mật khẩu mới (giải pháp 'kém thanh lịch' mà tôi đã mô tả trong OP) âCác bit ngẫu nhiên bổ sungâ có vẻ là một lựa chọn tốt. Bạn có thể giúp tôi hiểu tại sao việc thêm 64 bit ngẫu nhiên làm giảm độ lệch thành $2^{-64}$ không?
Gilles 'SO- stop being evil' avatar
lá cờ cn
@JoeJafarTheJenie Chúng tôi được tặng $2^{n-1} \le p \le 2^n-1$. Gọi $(q,r)$ là thương và số dư của phép chia $2^{n+64}-1$ cho $p-1$. Chúng ta vẽ $X$ đều trong $[0, 2^{n+64}-1]$ và lấy $X \bmod (p-1)$. Các số trong phạm vi $[0,r]$ có tiền tố $q+1$ và các số trong phạm vi $[r+1, p-2]$ có tiền đề $q$. Vì vậy, các giá trị nhỏ hơn $r$ có khả năng gấp $1 + 1/q$ so với các giá trị lớn hơn $r$. $q = \lfloor (2^{n+64}-1) / (p-1) \rfloor \ge \lfloor (2^{n+64}-1) / (2^n-1) \rfloor \ khoảng 2^{64}$ nên độ lệch $1/q$ nhỏ hơn $2^{-64}$.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.