开发者

RSA example that do not use NoPadding

开发者 https://www.devze.com 2022-12-25 12:57 出处:网络
Where can I find a RSA encrypt example that does not use \"NoPadding\"? --update Better: how to make this SSCCE run correctly without throw the \"too much data for RSA block\" exception?

Where can I find a RSA encrypt example that does not use "NoPadding"?

--update

Better: how to make this SSCCE run correctly without throw the "too much data for RSA block" exception?

import java.math.BigInteger;
import java.security.KeyFactory;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.RSAPrivateKeySpec;
import java.security.spec.RSAPublicKeySpec;

import javax.crypto.Cipher;

/**
 * Basic RSA example.
 */
public class TestRSA {

    public static void main(String[] args) throws Exception {

 byte[] input = new byte[100];

 Cipher cipher = Cipher.getInstance("RSA/None/NoPadding", "BC");
 KeyFactory keyFactory = KeyFactory.getInstance("RSA", "BC");

 // create the keys

 RSAPublicKeySpec pubKeySpec = new RSAPublicKeySpec(new BigInteger("d46f473a2d746537de2056ae3092c451",
  16), new BigInteger("11", 16));
 RSAPrivateKeySpec privKeySpec = new RSAPrivateKeySpec(new BigInteger(
 开发者_JS百科 "d46f473a2d746537de2056ae3092c451", 16), new BigInteger("57791d5430d593164082036ad8b29fb1",
  16));

 RSAPublicKey pubKey = (RSAPublicKey) keyFactory.generatePublic(pubKeySpec);
 RSAPrivateKey privKey = (RSAPrivateKey) keyFactory.generatePrivate(privKeySpec);

 // encryption step

 cipher.init(Cipher.ENCRYPT_MODE, pubKey);

 byte[] cipherText = cipher.doFinal(input);

 // decryption step

 cipher.init(Cipher.DECRYPT_MODE, privKey);

 byte[] plainText = cipher.doFinal(cipherText);

    }
}

--update: about loop

Using:

 byte[] cipherText = new byte[input.length];
 for (int i = 0; i < input.length; i++) {
     byte[] singleByteArray = new byte[] { input[i] };
     cipherText[i] = cipher.doFinal(singleByteArray)[0];
 }

does not work fine. For a unknown reason the cipherText became full of zeros - even if the input is an array of 0x03.


The Sun Providers Documentation for the SunJCE provider tells you what padding specifications are allowed in the Cipher.getInstance() argument. Try Cipher.getInstance("RSA/ECB/PKCS1PADDING");

EDIT:
It is not a padding issue, it is more that you have a misunderstanding of how RSA is used in cryptography. You can either 1) make the modulus bigger than the data, 2) use a Hybrid cryptosystem, or 3) least desirable is to manually break up the input into chunks that are each smaller than the modulus. If you are going to use PKCS1 padding (which is generally recommended), then the input must be not larger than n-11 bytes in length, where n is the number of bytes needed to store the RSA modulus.


 Cipher cipher = Cipher.getInstance("RSA");
 cipher.init(Cipher.ENCRYPT_MODE, publicKey);
 byte[] cipherData = cipher.doFinal(content);

Update: Are you sure you need bouncycastle for this? And why not just pass RSA as argument to Cipher.getInstance(..) ?

Update 2: Why don't you try any of these RSA encryption examples?

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号