一般加密原理是,由用户共有的公共密钥和传输数据的用户直接有的私有密钥组成。每次加密的时候,都是由一定算法随机生成一对密钥,用密钥加密所需加密的文件,用公钥加密密钥,然后将这些一起传输给目标用户,目标用户将数据处理后,又按照此密钥加密,然后传输回去。
这样的优点别人很难破解,网络上的数据无法定位,而且产生的密钥是随机的。
接下来这个例子就是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对文件进行解密。
本文介绍了一种使用Java实现的RSA加密解密过程,包括密钥生成、文件加密和解密的具体步骤。通过实际代码展示了如何利用RSA算法安全地传输数据。
1236

被折叠的 条评论
为什么被折叠?



