果有 IV,那么 encrypt() 方法用一个 ParametersWithIV 实例初始化 CBCBlockCipher。注意在 清 单 9 的 if (ivBytes != null) 块中,我传递了一个 ParametersWithIV 实例作为给 cbcCipher.init() 方法调用的第二个参数。
如果第三个参数为 null,那么 encrypt() 方法就用一个 KeyParameter 对象实始化 CBCBlockCipher 对象。注意在 清单 9 中的 else 块中,我传递了一个 KeyParameter 实例作为 cbcCipher.init() 方法 调用的第二个参数。
第二篇文章的清单 11 中的 getFinalKey() 方法返回输入数据最后一块的处理结果。另一方面, encrypt() 方法将纯文本处理的每一步的结果串接在一起、并返回串接在一起的所有处理过的(加密的) 字节。
清单 9. encrypt() 方法
public byte[] encrypt(byte[] keyBytes, byte[] plainData, byte[] ivBytes)
{
byte[] encryptedData = new byte[plainData.length];
CBCBlockCipher cbcCipher = new CBCBlockCipher(new DESEngine());
KeyParameter keyParameter = new KeyParameter(keyBytes);
if (ivBytes != null) {
ParametersWithIV kpWithIV = new ParametersWithIV (keyParameter, ivBytes);
cbcCipher.init(true, kpWithIV);
} else
cbcCipher.init(true, keyParameter);
int offset = 0;
int processedBytesLength = 0;
while (offset < encryptedData.length) {
try {
processedBytesLength = cbcCipher.processBlock( plainData,
offset,
encryptedData,
offset
);
offset += processedBytesLength;
} catch (Exception e) {
e.printStackTrace();
}//catch
}
return encryptedData;
}
用Kerberos为J2ME应用程序上锁,第3部分 - 建立与电子银行的安全通信(上)(8)
时间:2011-08-05 IBM Faheem Khan
decrypt()
( 清单 10 显示的) decrypt() 方法与 encrypt() 方法的工作方式完全相同,只不过解密时, cbcCipher.init() 方法的第一个参数是 false (加密时它是 true )。
清单 10. decrypt() 方法
public byte[] decrypt(byte[] keyBytes, byte[] encryptedData, byte[] ivBytes)
{
byte[] plainData = new byte[encryptedData.length];
CBCBlockCipher cbcCipher = new CBCBlockCipher(new DESEngine());
KeyParameter keyParameter = new KeyParameter(keyBytes);
if (ivBytes != null) {
ParametersWithIV kpWithIV = new ParametersWithIV (keyParameter, ivBytes);
cbcCipher.init(false, kpWithIV);
} else
cbcCipher.init(false, keyParameter);
int offset = 0;
int processedBytesLength = 0;
while (offset < encryptedData.length) {
try {
processedBytesLength = cbcCipher.processBlock( encryptedData,
offset,
plainData,
offset
);
offset += process
|