Để 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 CryptoException
là ILLEGAL_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.)
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
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. –
Vì vậy, tôi sẽ chú ý đến tài liệu, không thể đợi mã hóa AEAD;) – Raoul722