2015-08-22 13 views
6

Vì vậy, Java có chế độ được gọi là RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING. Điều đó có nghĩa là gì?chia nhỏ RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING

RFC3447, Tiêu chuẩn Công-Key Cryptography (PKCS) # 1: RSA Cryptography Thông số kỹ thuật phiên bản 2.1, phần 7.1.2 Giải mã hoạt động nói Hash và MGF là cả hai lựa chọn cho RSAES-OAEP-giải mã. MGF là chức năng riêng của nó, được định nghĩa trong Phần B.2.1 MGF1 và có tùy chọn "tùy chọn" băm của chính nó.

Có lẽ tùy chọn "Hash" trong RSAES-OAEP-DECRYPT và MGF1 được cho là giống nhau hoặc có thể là không, không rõ ràng đối với tôi. Nếu họ là sau đó tôi đoán khi bạn có RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING có nghĩa là sha256 nên được sử dụng cho cả hai. Nhưng nếu chúng không phải là giống nhau thì bạn có thể có sha256 được sử dụng cho RSAES-OAEP-DECRYPT và, ví dụ, sha1 được sử dụng cho MGF1. Và nếu đó là trường hợp thì hàm sha256 sẽ được sử dụng để làm gì? Và thuật toán băm nào được cho là được sử dụng cho các chức năng khác?

ECB có ý nghĩa gì trong ngữ cảnh này? ECB là một chế độ mã hóa khối đối xứng. Sách mã điện tử. Có lẽ nó có nghĩa là làm thế nào Java đối phó với plaintext của lớn hơn modulo? Giống như có thể chia nhỏ văn bản thành các phần lớn bằng modulo và sau đó mã hóa từng phần với RSA và nối chúng lại với nhau? Tôi chỉ đoán ..

Trả lời

17

Giá trị mặc định cho OAEP là sử dụng SHA-1 cho MGF1. Lưu ý rằng băm được chọn không có nhiều tác động đến bảo mật của OAEP, vì vậy phần lớn nó sẽ được để mặc định này.

Chúng ta có thể dễ dàng kiểm tra điều này bằng cách kiểm tra nó chống lại "OAEPPadding"OAEPParameterSpec:

// --- we need a key pair to test encryption/decryption 
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA"); 
kpg.initialize(1024); // speedy generation, but not secure anymore 
KeyPair kp = kpg.generateKeyPair(); 
RSAPublicKey pubkey = (RSAPublicKey) kp.getPublic(); 
RSAPrivateKey privkey = (RSAPrivateKey) kp.getPrivate(); 

// --- encrypt given algorithm string 
Cipher oaepFromAlgo = Cipher.getInstance("RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING"); 
oaepFromAlgo.init(Cipher.ENCRYPT_MODE, pubkey); 
byte[] ct = oaepFromAlgo.doFinal("owlstead".getBytes(StandardCharsets.UTF_8)); 

// --- decrypt given OAEPParameterSpec 
Cipher oaepFromInit = Cipher.getInstance("RSA/ECB/OAEPPadding"); 
OAEPParameterSpec oaepParams = new OAEPParameterSpec("SHA-256", "MGF1", new MGF1ParameterSpec("SHA-1"), PSpecified.DEFAULT); 
oaepFromInit.init(Cipher.DECRYPT_MODE, privkey, oaepParams); 
byte[] pt = oaepFromInit.doFinal(ct); 
System.out.println(new String(pt, StandardCharsets.UTF_8)); 

Mã này sẽ thất bại với một ngoại lệ đệm liên quan nếu bạn thay thế "SHA-256" cho MGF1 như tham số.

Lý do tại sao thuật toán mở rộng là cần thiết ở tất cả là khả năng tương thích với các thuật toán khác Cipher. Mã được viết cho ví dụ: "RSA/ECB/PKCS1Padding" không sử dụng bất kỳ thông số nào, hãy để một mình tham số OAEP. Vì vậy, không có chuỗi OAEP dài hơn không thể hoạt động như thay thế thả.


Các phương thức hoạt động "ECB" không có nghĩa là bất cứ điều gì trong bối cảnh này, nó cần phải có được "None" hoặc nó nên đã bị bỏ ra hoàn toàn. Bạn chỉ có thể mã hóa một khối bằng cách thực hiện RSA của nhà cung cấp SunRSA.

Nếu bạn muốn mã hóa nhiều dữ liệu hơn, hãy tạo khóa đối xứng ngẫu nhiên (AES) và mã hóa sử dụng OAEP. Sau đó, sử dụng khóa AES để mã hóa dữ liệu cụ thể của bạn. Điều này được gọi là một hệ thống mã hóa lai vì nó sử dụng cả hai nguyên thủy không đối xứng và đối xứng để mã hóa dữ liệu.

+1

Tôi đang chơi xung quanh với nhà cung cấp mật mã BouncyCastle và BouncyCastle dường như hoạt động khác nhau liên quan đến 'RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING'. I E. trong khi nhà cung cấp mật mã mặc định của Java sử dụng sha1 khi bouncycastle băm MGF xuất hiện để sử dụng sha256. Điều này có lẽ nên được xác minh độc lập nhưng đó là cách nó xuất hiện với tôi .. – neubert

+2

Tôi vừa xác minh điều này, sun.security.rsa.RSAPadding khi được sử dụng với OAEP SHA256, sử dụng SHA1 cho chức năng MGF1, lâu đài bouncy sử dụng SHA256 cho cả hai, đó là tại sao chúng không tương thích. – peceps

+2

@peceps Cảm ơn thông tin adfitional. Có một vài trường hợp góc mà BC không tương thích với việc thực hiện Mặt trời mặc định. Tôi sẽ hỏi đội BC nếu có ý định đó. –