excel报表工具FineReport权限:加密RSA加密算法1

2025-04-19 21:31:04

1、2.1加载bcprov-jdk14-146.jar驱动包RSA加密使用的第三方包,放到工程web-inf/lib文件夹下即可,如果没有驱动可点击bcprov-jd娱浣嫁装k14-146.jar驱动包下载。注:JBOSS服务器下,使用的第三方加密包,提示报错:Can not parse the BC Provider。需要将此包bcprov-jdk14-146.jar从报表工程下移入到JBOSS默认jar包路径下即可。

2、2.2调用js文件RSA文件夹为前端js加密时需要调用js文件,因此需要将Barrett.js、BigInt.js、RSA.js放到工程目录下如:WebReport/js,新建js文件夹放入js文件,如果没有此js文件可点击rsa/js下载。

3、2.3定义RSA加密类定义RSAUtil.java类文件,先运行类中generateKeyPair()方法,会在服务器D盘中生成一个随机的RSAKey.txt文件,保存公钥和密钥,每访问一次这个方法会刷新一次txt文件。

4、packagecom.fr.pri箪滹埘麽vilege;importjava.io.ByteArrayOutputStream;importjava.足毂忍珩io.FileInputStream;importjava.io.FileOutputStream;importjava.io.ObjectInputStream;importjava.io.ObjectOutputStream;importjava.math.BigInteger;importjava.security.KeyFactory;importjava.security.KeyPair;importjava.security.KeyPairGenerator;importjava.security.NoSuchAlgorithmException;importjava.security.PrivateKey;importjava.security.PublicKey;importjava.security.SecureRandom;importjava.security.interfaces.RSAPrivateKey;importjava.security.interfaces.RSAPublicKey;importjava.security.spec.InvalidKeySpecException;importjava.security.spec.RSAPrivateKeySpec;importjava.security.spec.RSAPublicKeySpec;importjavax.crypto.Cipher;/***RSA工具类。提供加密,解密,生成密钥对等方法。*需要到http://www.bouncycastle.org下载bcprov-jdk14-123.jar。**/publicclassRSAUtil{/****生成密钥对***@returnKeyPair**@throwsEncryptException*/publicstaticKeyPairgenerateKeyPair()throwsException{try{KeyPairGeneratorkeyPairGen=KeyPairGenerator.getInstance("RSA",neworg.bouncycastle.jce.provider.BouncyCastleProvider());finalintKEY_SIZE=1024;//没什么好说的了,这个值关系到块加密的大小,可以更改,但是不要太大,否则效率会低keyPairGen.initialize(KEY_SIZE,newSecureRandom());KeyPairkeyPair=keyPairGen.generateKeyPair();saveKeyPair(keyPair);returnkeyPair;}catch(Exceptione){thrownewException(e.getMessage());}}publicstaticKeyPairgetKeyPair()throwsException{FileInputStreamfis=newFileInputStream("C:/RSAKey.txt");ObjectInputStreamoos=newObjectInputStream(fis);KeyPairkp=(KeyPair)oos.readObject();oos.close();fis.close();returnkp;}publicstaticvoidsaveKeyPair(KeyPairkp)throwsException{FileOutputStreamfos=newFileOutputStream("C:/RSAKey.txt");ObjectOutputStreamoos=newObjectOutputStream(fos);//生成密钥oos.writeObject(kp);oos.close();fos.close();}/****生成公钥***@parammodulus**@parampublicExponent**@returnRSAPublicKey**@throwsException*/publicstaticRSAPublicKeygenerateRSAPublicKey(byte[]modulus,byte[]publicExponent)throwsException{KeyFactorykeyFac=null;try{keyFac=KeyFactory.getInstance("RSA",neworg.bouncycastle.jce.provider.BouncyCastleProvider());}catch(NoSuchAlgorithmExceptionex){thrownewException(ex.getMessage());}RSAPublicKeySpecpubKeySpec=newRSAPublicKeySpec(newBigInteger(modulus),newBigInteger(publicExponent));try{return(RSAPublicKey)keyFac.generatePublic(pubKeySpec);}catch(InvalidKeySpecExceptionex){thrownewException(ex.getMessage());}}/****生成私钥***@parammodulus**@paramprivateExponent**@returnRSAPrivateKey**@throwsException*/publicstaticRSAPrivateKeygenerateRSAPrivateKey(byte[]modulus,byte[]privateExponent)throwsException{KeyFactorykeyFac=null;try{keyFac=KeyFactory.getInstance("RSA",neworg.bouncycastle.jce.provider.BouncyCastleProvider());}catch(NoSuchAlgorithmExceptionex){thrownewException(ex.getMessage());}RSAPrivateKeySpecpriKeySpec=newRSAPrivateKeySpec(newBigInteger(modulus),newBigInteger(privateExponent));try{return(RSAPrivateKey)keyFac.generatePrivate(priKeySpec);}catch(InvalidKeySpecExceptionex){thrownewException(ex.getMessage());}}/****加密***@paramkey*加密的密钥**@paramdata*待加密的明文数据**@return加密后的数据**@throwsException*/publicstaticbyte[]encrypt(PublicKeypk,byte[]data)throwsException{try{Ciphercipher=Cipher.getInstance("RSA",neworg.bouncycastle.jce.provider.BouncyCastleProvider());cipher.init(Cipher.ENCRYPT_MODE,pk);intblockSize=cipher.getBlockSize();//获得加密块大小,如:加密前数据为128个byte,而key_size=1024//加密块大小为127//byte,加密后为128个byte;因此共有2个加密块,第一个127//byte第二个为1个byteintoutputSize=cipher.getOutputSize(data.length);//获得加密块加密后块大小intleavedSize=data.length%blockSize;intblocksSize=leavedSize!=0?data.length/blockSize+1:data.length/blockSize;byte[]raw=newbyte[outputSize*blocksSize];inti=0;while(data.length-i*blockSize>0){if(data.length-i*blockSize>blockSize)cipher.doFinal(data,i*blockSize,blockSize,raw,i*outputSize);elsecipher.doFinal(data,i*blockSize,data.length-i*blockSize,raw,i*outputSize);//这里面doUpdate方法不可用,查看源代码后发现每次doUpdate后并没有什么实际动作除了把byte[]放到//ByteArrayOutputStream中,而最后doFinal的时候才将所有的byte[]进行加密,可是到了此时加密块大小很可能已经超出了//OutputSize所以只好用dofinal方法。i++;}returnraw;}catch(Exceptione){thrownewException(e.getMessage());}}/****解密***@paramkey*解密的密钥**@paramraw*已经加密的数据**@return解密后的明文**@throwsException*/publicstaticbyte[]decrypt(PrivateKeypk,byte[]raw)throwsException{try{Ciphercipher=Cipher.getInstance("RSA",neworg.bouncycastle.jce.provider.BouncyCastleProvider());cipher.init(cipher.DECRYPT_MODE,pk);intblockSize=cipher.getBlockSize();ByteArrayOutputStreambout=newByteArrayOutputStream(64);intj=0;while(raw.length-j*blockSize>0){bout.write(cipher.doFinal(raw,j*blockSize,blockSize));j++;}returnbout.toByteArray();}catch(Exceptione){thrownewException(e.getMessage());}}/*******@paramargs**@throwsException*/publicstaticvoidmain(String[]args)throwsException{RSAPublicKeyrsap=(RSAPublicKey)RSAUtil.generateKeyPair().getPublic();Stringtest="helloworld";byte[]en_test=encrypt(getKeyPair().getPublic(),test.getBytes());System.out.println("123:"+newString(en_test));byte[]de_test=decrypt(getKeyPair().getPrivate(),en_test);System.out.println(newString(de_test));}}

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢