不过要说明的是,java因为是备顷字节码,所以没有办法防止被反编译。
最多也就是做袭卜一下代码混淆,比如把方法或变量名改成无意义的名称,或者加一些完全无用的代码进去,让恶意攻击的人难以看懂
都看不旦灶绝到的,java程序分为:模姿
编辑
编译
解释
运行
运行的都是.class字节辩谈码文件,看不到源文件的,你不用 *** 心
采纳即可
鉴于rsa加密的重要性和相关源代码的匮乏 经过整理特此贴出 需要下载bcprov jdk jar import javax crypto Cipherimport java security *import java security spec RSAPublicKeySpec清纳import java security spec RSAPrivateKeySpecimport java security spec InvalidKeySpecExceptionimport java security interfaces RSAPrivateKeyimport java security interfaces RSAPublicKeyimport java io *import java math BigInteger/*** RSA 工具类 提供加密 解密 生成密钥对等方法 * 需要到下载bcprov jdk jar **/public class RSAUtil {/*** 生成密钥对* @return KeyPair* @throws EncryptException*/public static KeyPair generateKeyPair() throws EncryptException {try {槐码KeyPairGenerator keyPairGen = KeyPairGenerator getInstance( RSA new bouncycastle jce provider BouncyCastleProvider())final int KEY_SIZE = //没什么好说的了 这个值关系到块加密的大小 可以更改 但是不要太大 否则效率会低keyPairGen initialize(KEY_SIZE new SecureRandom())KeyPair keyPair = keyPairGen genKeyPair()return keyPair} catch (Exception e) {throw new EncryptException(e getMessage())}}/*** 生成公钥* @param modulus* @param publicExponent* @return RSAPublicKey* @throws EncryptException*/public static RSAPublicKey generateRSAPublicKey(byte[] modulus byte[] publicExponent) throws EncryptException {KeyFactory keyFac = nulltry {keyFac = KeyFactory getInstance( RSA new bouncycastle jce provider BouncyCastleProvider())} catch (NoSuchAlgorithmException ex) {throw new EncryptException(ex getMessage())}RSAPublicKeySpec pubKeySpec = new RSAPublicKeySpec(new BigInteger(modulus) new BigInteger(publicExponent))try {return (RSAPublicKey) keyFac generatePublic(pubKeySpec)} catch (InvalidKeySpecException ex) {throw new EncryptException(ex getMessage())}}/*** 生成私钥* @param modulus 铅正哪 * @param privateExponent* @return RSAPrivateKey* @throws EncryptException*/public static RSAPrivateKey generateRSAPrivateKey(byte[] modulus byte[] privateExponent) throws EncryptException {KeyFactory keyFac = nulltry {keyFac = KeyFactory getInstance( RSA new bouncycastle jce provider BouncyCastleProvider())} catch (NoSuchAlgorithmException ex) {throw new EncryptException(ex getMessage())}RSAPrivateKeySpec priKeySpec = new RSAPrivateKeySpec(new BigInteger(modulus) new BigInteger(privateExponent))try {return (RSAPrivateKey) keyFac generatePrivate(priKeySpec)} catch (InvalidKeySpecException ex) {throw new EncryptException(ex getMessage())}}/*** 加密* @param key 加密的密钥* @param data 待加密的明文数据* @return 加密后的数据* @throws EncryptException*/public static byte[] encrypt(Key key byte[] data) throws EncryptException {try {Cipher cipher = Cipher getInstance( RSA new bouncycastle jce provider BouncyCastleProvider())cipher init(Cipher ENCRYPT_MODE key)int blockSize = cipher getBlockSize()//获得加密块大小 如 加密前数据为 个byte 而key_size= 加密块大小为 byte 加密后为 个byte因此共有 个加密块 第一个 byte第二个为 个byteint outputSize = cipher getOutputSize(data length)//获得加密块加密后块大小int leavedSize = data length % blockSizeint blocksSize = leavedSize != ? data length / blockSize + : data length / blockSizebyte[] raw = new byte[outputSize * blocksSize]int i = while (data length i * blockSize >) {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++}return raw} catch (Exception e) {throw new EncryptException(e getMessage())}}/*** 解密* @param key 解密的密钥* @param raw 已经加密的数据* @return 解密后的明文* @throws EncryptException*/public static byte[] decrypt(Key key byte[] raw) throws EncryptException {try {Cipher cipher = Cipher getInstance( RSA new bouncycastle jce provider BouncyCastleProvider())cipher init(cipher DECRYPT_MODE key)int blockSize = cipher getBlockSize()ByteArrayOutputStream bout = new ByteArrayOutputStream( )int j = while (raw length j * blockSize >) {bout write(cipher doFinal(raw j * blockSize blockSize))j++}return bout toByteArray()} catch (Exception e) {throw new EncryptException(e getMessage())}}/**** @param args* @throws Exception*/public static void main(String[] args) throws Exception {File file = new File( l )FileInputStream in = new FileInputStream(file)ByteArrayOutputStream bout = new ByteArrayOutputStream()byte[] tmpbuf = new byte[ ]int count = while ((count = in read(tmpbuf)) != ) {bout write(tmpbuf count)tmpbuf = new byte[ ]}in close()byte[] Data = bout toByteArray()KeyPair keyPair = RSAUtil generateKeyPair()RSAPublicKey pubKey = (RSAPublicKey) keyPair getPublic()RSAPrivateKey priKey = (RSAPrivateKey) keyPair getPrivate()byte[] pubModBytes = pubKey getModulus() toByteArray()byte[] pubPubExpBytes = pubKey getPublicExponent() toByteArray()byte[] priModBytes = priKey getModulus() toByteArray()byte[] priPriExpBytes = priKey getPrivateExponent() toByteArray()RSAPublicKey recoveryPubKey = RSAUtil generateRSAPublicKey(pubModBytes pubPubExpBytes)RSAPrivateKey recoveryPriKey = RSAUtil generateRSAPrivateKey(priModBytes priPriExpBytes)byte[] raw = RSAUtil encrypt(priKey Data)file = new File( encrypt_result dat )OutputStream out = new FileOutputStream(file)out write(raw)out close()byte[] data = RSAUtil decrypt(recoveryPubKey raw)file = new File( l )out = new FileOutputStream(file)out write(data)out flush()out close()}}加密可以用公钥 解密用私钥 或者加密用私钥 通常非对称加密是非常消耗资源的 因此可以对大数据用对称加密如 des(具体代码可以看我以前发的贴子) 而对其对称密钥进行非对称加密 这样既保证了数据的安全 还能保证效率 lishixinzhi/Article/program/Java/gj/201311/27391
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)