一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第6天,点击查看活动详情。
背景需求
应用开发中,为了安全,免不了多字符串进行加密和解密。OkIO 对这种需求也提供了很好的支持。
支持
开发者只需要关注使用的算法、秘钥和特定算法的附加参数(例如初始化向量)来完成初始化加密或加密密码。
AES举例
AES的全称是Advanced Encryption Standard,意思是高级加密标准。它的出现主要是为了取代DES加密算法的,因为我们都知道DES算法的密钥长度是56Bit,因此算法的理论安全强度是2的56次方。
在密钥加法层中有两个输入的参数,分别是明文和子密钥k[0],而且这两个输入都是128位的。k[0]实际上就等同于密钥k,具体原因在密钥生成中进行介绍。我们前面在介绍扩展域加减法中提到过,在扩展域中加减法操作和异或运算等价,所以这里的处理也就异常的简单了,只需要将两个输入的数据进行按字节异或操作就会得到运算的结果。
在OKIO中,AES的使用非常简单。以AES加密的典型用法为例,其中key
和iv
参数都为16字节长度。
步骤
使用Okio.cipherSink(Sink, Cipher)
或Okio.cipherSource(Source, Cipher)
使用分組密碼加密或解密流。
代码举例
void encryptAes(ByteString bytes, Path path, byte[] key, byte[] iv)
throws GeneralSecurityException, IOException {
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key, "AES"), new IvParameterSpec(iv));
try (BufferedSink sink = Okio.buffer(
Okio.cipherSink(FileSystem.SYSTEM.sink(path), cipher))) {
sink.write(bytes);
}
}
ByteString decryptAesToByteString(Path path, byte[] key, byte[] iv)
throws GeneralSecurityException, IOException {
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key, "AES"), new IvParameterSpec(iv));
try (BufferedSource source = Okio.buffer(
Okio.cipherSource(FileSystem.SYSTEM.source(path), cipher))) {
return source.readByteString();
}
}
其他的一些加密和解密汇总如下
标题 | |
---|---|