一般加密原理是,由用户共有的公共密钥和传输数据的用户直接有的私有密钥组成。每次加密的时候,都是由一定算法随机生成一对密钥,用密钥加密所需加密的文件,用公钥加密密钥,然后将这些一起传输给目标用户,目标用户将数据处理后,又按照此密钥加密,然后传输回去。
这样的优点别人很难破解,网络上的数据无法定位,而且产生的密钥是随机的。
接下来这个例子就是java核心技术卷2高级特性安全性一章的最后一个例子。
import
java.io.
*
;
import
java.security.
*
;
import
javax.crypto.
*
;
import
javax.crypto.interfaces.
*
;
import
javax.crypto.spec.
*
;

public
class
RSATest
...
{

private static final int KEYSIZE = 512 ;


/** */ /**
* @param args
*/

public static void main(String[] args) ... {
// TODO Auto-generated method stub

try ... {

if (args[ 0 ].equals( " -genkey " )) ... {
KeyPairGenerator keyPair = KeyPairGenerator.getInstance( " RSA " );
SecureRandom random = new SecureRandom();
keyPair.initialize(KEYSIZE, random);
KeyPair keyP = keyPair.generateKeyPair();
ObjectOutputStream oos = new ObjectOutputStream( new FileOutputStream(args[ 1 ]));
oos.writeObject(keyP.getPublic());
oos.close();
oos = new ObjectOutputStream( new FileOutputStream(args[ 2 ]));
oos.writeObject(keyP.getPrivate());
oos.close();

} else if (args[ 0 ].equals( " -encrypt " )) ... {
KeyGenerator keygen = KeyGenerator.getInstance( " AES " );
SecureRandom random = new SecureRandom();
keygen.init(random);
SecretKey key = keygen.generateKey();
ObjectInputStream kin = new ObjectInputStream( new FileInputStream(args[ 3 ]));
Key publicKey = (Key)kin.readObject();
kin.close();
Cipher cipher = Cipher.getInstance( " RSA " );
System.out.println(cipher.getAlgorithm());
cipher.init(Cipher.WRAP_MODE,publicKey);
byte [] wrappedKey = cipher.wrap(key);
DataOutputStream out = new DataOutputStream( new FileOutputStream(args[ 2 ]));
out.writeInt(wrappedKey.length);
out.write(wrappedKey);
InputStream in = new FileInputStream(args[ 1 ]);
cipher = Cipher.getInstance( " AES " );
cipher.init(Cipher.ENCRYPT_MODE, key);
crypt(in,out,cipher);
in.close();
out.close();

} else ... {
DataInputStream in = new DataInputStream( new FileInputStream(args[ 1 ]));
int length = in.readInt();
byte []wrappedKey = new byte [length];
in.read(wrappedKey, 0 ,length);
ObjectInputStream keyIn = new ObjectInputStream( new FileInputStream(args[ 3 ]));
Key privateKey = (Key) keyIn.readObject();
keyIn.close();
Cipher cipher = Cipher.getInstance( " RSA " );
cipher.init(Cipher.UNWRAP_MODE, privateKey);
Key key = cipher.unwrap(wrappedKey, " AES " , Cipher.SECRET_KEY);
OutputStream out = new FileOutputStream(args[ 2 ]);
cipher = Cipher.getInstance( " AES " );
cipher.init(Cipher.ENCRYPT_MODE, key);
crypt(in,out,cipher);
in.close();
out.close();
}

} catch (Exception e) ... {
e.printStackTrace();
}
}


private static void crypt(InputStream in, OutputStream out, Cipher cipher) throws IOException,GeneralSecurityException ... {
// TODO Auto-generated method stub
int blockSize = cipher.getBlockSize();
int outputSize = cipher.getOutputSize(blockSize);
byte [] inBytes = new byte [blockSize];
byte [] outputBytes = new byte [outputSize];
int inLength = 0 ;
boolean more = true ;

while (more) ... {
inLength = in.read(inBytes);

if (inLength == blockSize) ... {
int outLength = cipher.update(inBytes, 0 ,blockSize,outputBytes);
out.write(outputBytes, 0 , outLength);
} else
more = false ;
}
if (inLength > 0 )
outputBytes = cipher.doFinal(inBytes, 0 , inLength);
else
outputBytes = cipher.doFinal();
out.write(outputBytes);
}

}
运行的时候,先在eclipse里面运行的参数里加上-genkey public.key private.key
生成两个文件,就是用于加密的公钥和私钥。
然后运行的参数里面加上-encrypt textFile encryptedFile public.key对第二个参数对应的文件加密,第三个参数对应的就是生成的加密过的文件。
最后运行-decrypt encryptedFile decryptedFile private.key对文件进行解密。