解密的数据字节数组由三部分组成。第一部分由前八位组成,它包含一个称为 confounder 的随机数。confounder 字节没有意义,它们只是帮助增加黑客的攻击的难度。
解密的数据的第 9 到第 24 个字节构成了第二部分,它包含一个 16 字节的 MD5 摘要值。这个摘要 值是对整个解密的数据 ―― 其中16 个摘要字节(第二部分)是用零填充的 ―― 计算的。
第三部分是要得到实际纯文本数据。
因为第八步进行完整性检查,所以必须将解密的数据的第 9 到第 24 个字节用零填充,对整个数据计 算一个 MD5 摘要值,并将摘要值与第二部分(第 9 到第 24 个字节)进行匹配。如果两个摘要值匹配, 那么消息的完整性就得到验证。
用Kerberos为J2ME应用程序上锁,第3部分 - 建立与电子银行的安全通信(上)(10)
时间:2011-08-05 IBM Faheem Khan
第 9 步:如果通过了完整性检查,那么就返回解密的数据的第三部分(第 25 个字节到结束)。
清单 12. decryptAndVerifyDigest() 方法
public byte[] decryptAndVerifyDigest (byte[] encryptedData, byte[] decryptionKey)
{
/****** Step 1: ******/
if (isSequence(encryptedData[0])) {
/****** Step 2: ******/
byte[] eType = getASN1Structure(getContents(encryptedData),
CONTEXT_SPECIFIC, 0);
if (eType != null) {
/****** Step 3: ******/
int eTypeValue = getIntegerValue(getContents(getContents(eType)));
/****** Step 4: ******/
if ( eTypeValue == 3) {
/****** Step 5: ******/
byte[] cipher = getASN1Structure(getContents(encryptedData),
CONTEXT_SPECIFIC, 2);
/****** Step 6: ******/
byte[] cipherText = getContents(getContents(cipher));
if (cipherText != null) {
/****** Step 7: ******/
byte[] plainData = decrypt(decryptionKey,
cipherText, null);
/****** Step 8: ******/
int data_offset = 24;
byte[] cipherCksum = new byte [16];
for (int i=8; i < data_offset; i++)
cipherCksum[i-8] = plainData[i];
for (int j=8; j < data_offset; j++)
plainData[j] = (byte) 0x00;
byte[] digestBytes = getMD5DigestValue(plainData);
for (int x =0; x < cipherCksum.length; x++) {
if (!(cipherCksum[x] == digestBytes[x]))
return null;
}
byte[] decryptedAndVerifiedData = new byte[plainData.length - data_offset];
/****** Step 9: ******/
for (int i=0; i < decryptedAndVerifiedData.length; i++)
decryptedAndVerifiedData[i] = plainData[i+data_offset];
return decryptedAndVerifiedData;
} else
return
|