作者H45 (!H45)
站内java
标题Re: [问题] AES加解密..
时间Wed Jul 2 20:40:53 2008
※ 引述《reon (完成这条天堂路)》之铭言:
: ※ 引述《jet113102 (传说中的Yi)》之铭言:
: : 小弟在网路上有找到AES加密的source code
: : 然而他是以字串去处理的
: : 我把它改成其他的档案 (EX:JPEG) 之类的使他强制读取文字後加密
: : 加密没出问题, 但解密时出现了错误= =
: : javax.crypto.IllegalBlockSizeException: Input length must be multiple of 16
: : when decrypting with padded cipher
: : 我似乎太天真了 囧...
: : 如果说我要进行加解密有办法以档案直接做吗?
: : 还是说以读取字串的方法进行修改即可?
: 感觉你讲的没很清楚
: 如果你要用AES加密 那Java本身就有了 不需要额外去找Source Code吧?
: 因为Java本身支援的加解密已经颇完整了
: 我觉得你解不出来是不是 你把密文 用同样的key 加密的souce code来解密?
: AES虽然是对称式加密 但是加密和解密函式不同!! 不要被DES误导
: DES才是加密和解密函式相同!!
: 要用Java内建的AES加密 资料必须是byte array型态
: 有兴趣的话自己去看一下欧莱礼出的 JAVA安全防护 和 官网JCA guide
大家好!我又来了....
刚刚把有关加解密串流的类别稍微看了一下:
Cipher, CipherInputStream, CipherOutputStream, KeyGenerator
消化之後,变成下面的程式码,把字串加密至档案,再从该档案解密至另一个档案。
public static void main(String[] args) throws Exception {
// 产生 AES 专用的钥匙,以後加密解密都用这一把。
Key key = KeyGenerator.getInstance("AES").generateKey();
// 加解密的演算法是 AES, 模式是 CBC, 填充是 PKCS5Padding
String transformation = "AES/CBC/PKCS5Padding";
// 依上述演算法、模式与填充的方法建立一个加密器
Cipher encryption = Cipher.getInstance(transformation);
encryption.init(Cipher.ENCRYPT_MODE, key);
// 依上述演算法、模式与填充的方法建立一个解密器
Cipher decryption = Cipher.getInstance(transformation);
decryption.init(Cipher.DECRYPT_MODE, key, encryption.getParameters());
// 开始加密的示范
encrypt(encryption, key);
// 开始解密的示范
decrypt(decryption, key);
// 执行完之後来个 OK!
System.out.println("OK!");
}
private static void encrypt(Cipher encryption, Key key)
throws Exception {
// 建立加密的档案输出串流,放置加密後的资料,档名为 test.txt
FileOutputStream fos = new FileOutputStream(new File("test.txt"));
CipherOutputStream cos = new CipherOutputStream(fos, encryption);
// 即将要被加密的讯息
String messages[] = { "BOOK", "DESK" };
// 写入档案串流中
for (int i = 0; i < messages.length; i++) {
cos.write(messages[i].getBytes());
}
// 把该关的关一关
cos.flush();
cos.close();
fos.close();
}
private static void decrypt(Cipher decryption, Key key) throws Exception {
// 建立解密的档案输入串流,档名为 test.txt
FileInputStream fis = new FileInputStream(new File("test.txt"));
CipherInputStream cis = new CipherInputStream(fis, decryption);
// 建立档案输出串流,放置解密之後的结果,档名为 result.txt
FileOutputStream fos = new FileOutputStream(new File("result.txt"));
// 把那些从 test.txt 读到的东西写到 result.txt
while (fis.available() > 0) {
byte[] buffer = new byte[1024];
int length = cis.read(buffer);
fos.write(buffer, 0, length);
}
// 把该关的东西关一关
fos.flush();
fos.close();
fis.close();
cis.close();
}
打开 test.txt 一看,结果是乱码:
,?軱v?wg ?M弦
然而 result.txt 十分正常:
BOOKDESK
如果想要加密其他的东西,只要有办法把资料转换至 byte[] 就可以了!
或者您可以利用 OutputStream 本身的装饰者模式,利用衍生的装饰者来做加密。
举例而言: new ObjectOutputStream(new CipherOutputStream(..., ...))
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.116.247.13