2015-08-18 12 views
6

Để tính hiệu quả một hình vuông trong thẻ Java, tôi muốn sử dụng thuật toán ALG_RSA_NOPAD với số mũ bằng 2 và mô đun lớn hơn kết quả mong đợi (do đó giảm mô đun không có hiệu lực).ALG_RSA_NOPAD trong thẻ Java

Nhưng tôi không thể sử dụng thuật toán ALG_RSA_NOPAD. Trong thực tế, khi tôi gọi phương thức doFinal(), tôi nhận được CryptoExceptionILLEGAL_VALUE. Trong Java Card 2.2.2 spec, nó nói rằng:

CryptoException.ILLEGAL_USE nếu một trong các điều kiện sau đây được đáp ứng:

• thuật toán Cipher này không pad được thông báo và thông điệp không phải là khối căn chỉnh.

• Thuật toán mã hóa này không đệm thông báo và không có dữ liệu đầu vào nào được cung cấp trong inBuff hoặc thông qua phương thức update().

• Độ dài tin nhắn đầu vào không được hỗ trợ.

• Dữ liệu được giải mã không bị ràng buộc bởi byte đệm phù hợp.

Vì vậy, tôi kết luận rằng thư của tôi không được căn chỉnh khối. Nhưng những gì khối liên kết có nghĩa là cho thuật toán này? Tin nhắn của tôi có cùng độ dài với mô-đun không? Số mũ? Tôi cố gắng điều khác nhau nhưng tôi không tìm thấy ...

Mã tương ứng:

byte[] res_RSA = new byte[(short) 0x0080]; 
    KeyPair rsa_KeyPair = new KeyPair(KeyPair.ALG_RSA,KeyBuilder.LENGTH_RSA_1024); 
     rsa_KeyPair.genKeyPair(); 
    RSAPublicKey rsa_PubKey; rsa_PubKey = (RSAPublicKey) rsa_KeyPair.getPublic(); 


    rsa_PubKey.setExponent(new byte[]{(byte) 0x02}, (short) 0x00000, (short) 0x0001); 
    rsa_PubKey.setModulus(new byte[] { (byte) 0xFF, (byte) 0xFF, 
     (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 
     (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 
     (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 
     (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 
     (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 
     (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 
     (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 
     (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 
     (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 
     (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 
     (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 
     (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 
     (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 
     (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 
     (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 
     (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 
     (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 
     (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 
     (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 
     (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 
     (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 
     (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 
     (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 
     (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 
     (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 
     (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 
     (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 
     (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 
     (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 
     (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 
     (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 
     (byte) 0xFF, (byte) 0xFF, }, (short) 0x0000, (short) 0x0080); 

    cipherRSA = Cipher.getInstance(Cipher.ALG_RSA_NOPAD, false); 

    x = new byte[] { (byte) 0x0C, (byte) 0xE2, (byte) 0x65, (byte) 0x92, 
     (byte) 0x98, (byte) 0x84, (byte) 0x4C, (byte) 0x6C, 
     (byte) 0x39, (byte) 0x31, (byte) 0x78, (byte) 0x22, 
     (byte) 0x99, (byte) 0x39, (byte) 0xAD, (byte) 0xAD, 
     (byte) 0x74, (byte) 0x31, (byte) 0x45, (byte) 0xD2, 
     (byte) 0xB9, (byte) 0x37, (byte) 0xB2, (byte) 0x92, 
     (byte) 0x7D, (byte) 0x32, (byte) 0xE9, (byte) 0x70, 
     (byte) 0x91, (byte) 0x7D, (byte) 0x78, (byte) 0x45, 
     (byte) 0xC9, (byte) 0x5C, (byte) 0xF9, (byte) 0xF2, 
     (byte) 0xFD, (byte) 0xB9, (byte) 0xAE, (byte) 0x6C, 
     (byte) 0xC9, (byte) 0x42, (byte) 0x64, (byte) 0xBA, 
     (byte) 0x2A, (byte) 0xCE, (byte) 0x5A, (byte) 0x71, 
     (byte) 0x60, (byte) 0x58, (byte) 0x56, (byte) 0x17, 
     (byte) 0x2E, (byte) 0x25, (byte) 0xDD, (byte) 0x47, 
     (byte) 0x23, (byte) 0x6B, (byte) 0x15, (byte) 0x76, 
     (byte) 0x8F, (byte) 0x2A, (byte) 0x87, (byte) 0xC7 }; 

    cipherRSA.init(rsa_PubKey, Cipher.MODE_ENCRYPT); 
    cipherRSA.doFinal(x, (short) 0x0000, 
      (short) 0x0040, res_RSA, (short) 0x0000); 

Vì vậy, các CryptoException được nâng lên ở dòng cuối cùng, nhưng tôi thực sự không hiểu tại sao.

(Lưu ý rằng, trong mã của tôi, tôi đặt các module với giá trị lớn nhất của chiều dài 128bytes để chắc chắn rằng quảng trường sẽ không bị ảnh hưởng.)

Trả lời

3

Vâng, trên thẻ của tôi tin nhắn phải có cùng độ dài so với mô đun ... Tôi nghĩ rằng tôi đã thử nghiệm trường hợp này nhưng tôi không phù hợp với bù đắp.

Vì vậy, ngay cả thông điệp của tôi không phải là mô-đun (tôi không thể tính toán một hình vuông) Tôi phải điền vào mảng với số không.

2

Thường RSA đã chỉ được xác nhận để làm việc chống lại nhất định số mũ công khai cho việc triển khai cụ thể của Thẻ Java. Rất có thể vấn đề này sẽ biến mất nếu khi bạn sử dụng số mũ công khai lớn hơn như 65537 (0x01, 0x00, 0x01). Vui lòng tham khảo hướng dẫn sử dụng chip/nền tảng của bạn.

Lưu ý rằng các phép tính như vậy không có đệm không an toàn cho RSA. Điều đó có nghĩa là họ có thể khó giải thích cho các cơ quan chứng nhận. Bạn có thể có nhiều may mắn hơn với việc triển khai Diffie-Hellman (nếu có).

+0

Tôi sẽ thử lại với số mũ lớn hơn để kiểm tra. Liên quan đến Diffie-Hellman, API Java 2.2.2 API chỉ đề cập đến phiên bản đường cong elliptic, vì vậy tôi cho rằng bạn tham chiếu đến một API độc quyền? Cảm ơn bạn đã giải thích của bạn – Raoul722

+2

Vâng, đó hoặc 3.0.5, nhưng tôi không nghĩ rằng bạn sẽ tìm thấy JC 3.0.5 trong tự nhiên ... được nêu ra. –

+0

Vì vậy, tôi sẽ chú ý đến tài liệu, không thể đợi mã hóa AEAD;) – Raoul722

Các vấn đề liên quan