| 
				 int j; 
   uint16 t1,t2,t3; 
   IDEAkey T; 
   word16 *p=T+KEYLEN;  //数组的最后一个位置 
   t1=inv(*Z++); 
   t2=-*Z++; 
   t3=-*Z++; 
   *--p=inv(*Z++); // 最后一个解密密钥对应第四个加密密钥的转换 
   *--p=t3;  // 取反 
   *--p=t2;  // 取反 
   *--p=t1;  // 倒数第四个解密密钥对应第一个加密密钥的转换 
   for (j=1;j<ROUNDS;j++) 
   {  //以下依次生成解密密钥 
      t1=*Z++; 
      *--p=*Z++; 
      *--p=t1; 
      t1=inv(*Z++); 
      t2=-*Z++; 
      t3=-*Z++; 
      *--p=inv(*Z++); 
      *--p=t2; 
      *--p=t3; 
      *--p=t1; 
   } 
   t1=*Z++; 
   *--p=*Z++; 
   *--p=t1; 
   t1=inv(*Z++); 
   t2=-*Z++; 
   t3=-*Z++; 
   *--p=inv(*Z++); 
   *--p=t3; 
   *--p=t2; 
   *--p=t1; 
   /*copy and destroy temp copy*/ 
   for(j=0,p=T;j<KEYLEN;j++)  //复制解密密钥到DK中 
   { 
      *DK++=*p; 
      *p++=0; 
   } 
} 			
				 |