加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

FLASH与密码学-常用加密算法的AS3.0实现

发布时间:2020-12-15 18:40:18 所属栏目:百科 来源:网络整理
导读:这是过年的时候无聊在家写的,当时写了一半,昨天把它找了出来完成了第一篇。 这是一个系列,准备用AS3.0实现常见的标准加密算法。暂定包含有(DES,IDEA,RAS)。 DES加密算法 DES是一种相对”古老”的算法,在上个世纪70年代由IBM开发完成。在1976年被美国政
这是过年的时候无聊在家写的,当时写了一半,昨天把它找了出来完成了第一篇。
这是一个系列,准备用AS3.0实现常见的标准加密算法。暂定包含有(DES,IDEA,RAS)。

DES加密算法
DES是一种相对”古老”的算法,在上个世纪70年代由IBM开发完成。在1976年被美国政府采用,并于1977年作为非机要部门的数据加密标准而公布。DES是一种单密钥对称加解密算法。

DES算法流程
DES是一个分组加密算法,利用一个64位的密钥对64位的数据进行加密,输出64位的密文,64位的密钥当中,每一个字节的第8位作为奇偶校验位而忽略,所以实际上的密钥是56位,DES算法的步骤如下:
初始明文X经过初始IP置换表得到IP(X),把IP(X)分为两部分(L0,R0),经过16轮置换,XOR和替换操作后,通过逆IP置换表生成密文,公式如下:
Ln = R(n-1)?
Rn = L(n-1) + f (R(n-1),Kn)?
+号表示XOR异或操作。Kn为密钥分组。整个加密流程见下图


生成子密钥
K1-K16是由64位密钥经过16轮的循环移位生成的16组子密钥。
设密钥K(64位)= 01100011 01101111 01101101 01110000 01110101 01110100 01100101 01110010(大家经过8421码算一下,转换成16进制就是63 6F 6D 70 75 74 65 72,其实就是字符串computer)。注意红色标识的为奇偶校验位,实际密钥位56位。

对K使用PC-1表进行置换:


得出K+ (56位)= 00000000 22222111 22222111 10111000 00110111 01100000 01101000
把K+均分为两部分,那么
C0??=??00000000 22222111 22222111 1011 ,
D0 =? ?1000 00110111 01100000 01101000
然后开始根据移位常数表进行16轮移位,第1,2,9,16轮循环左移1位,其他左移2位。
那么
C1 = C0 循环左移1位 = 0000 0001 1111 1111 1111 1111 0110
D1 = C1 循环左移1位 = 0000 0110 1110 1100 0000 1101 0001

C2 = C1 循环左移1位 = 0000 0011 1111 1111 1111 1110 1100
D2 = C2 循环左移1位 = 0000 1101 1101 1000 0001 1010 0010

…….

C16 = C15 循环左移1位 = 0000 0000 1111 1111 1111 1111 1011
D16 = D15 循环左移1位 = 1000 0011 0111 0110 0000 0110 1000? ? ? ? ? ? ? ??

C(n) + D(n) = K(n), 对Kn使用PC-2表进行置换,得出16组子密钥(48位1组)
K1??= 11110000 10222220 11101110 11010000 00000111 10011000?
……
K16 = 11110001 10222220 00101110 00000001 10000010 01011110


加密过程

初始置换
设明文M(64位) = 01110100 01100101 01110011 01110100 00100000 01100100 01100101 01110011(就是字符串test des)

对明文M使用IP表进行置换
IP??=??11101111 10001101 01101011 11000110 00000000 22222111 00000000 10000100
进而?
L0 =??11101111 10001101 01101011 11000110
R0 =??00000000 22222111 00000000 10000100

16轮变换
从L0,R0开始 循环16次,使用上文的公式
Ln = R(n-1)?
Rn = L(n-1) + f (R(n-1),Kn)?
得出L1R1-L16R16,??函数f从一个32位的数据块和一个48位的子密钥Kn得到一个新的32位数据块(算法稍后详细介绍) 最终得出
L16 = 11000000 10110011 00110001 10001011
R16 = 10101110 10111011 11100010 10110010?


对R16L16(64位)使用IP-1表进行逆置换,得出密文:
00111010 01110111 01000000 01010010 00111001 02222201 10000100 11110111

最终我们从明文M??= 74 65 73 74 20 64 65 73?
得出密文? ?? ? C??= 3A 77 40 52 39 7D 84 F7

DES的加密与解密使用相同的算法,把密钥的使用顺序颠倒即可。

下面开始正式的编码
使用FD创建一个空项目,新建一个名为DES的类,方便起见我们把DES设成单件类,
第一步把我们上面所讲到的一些表编码进类里面
  1. package??
  2. {
  3. ? ? ? ? /**
  4. ? ? ? ???* ...
  5. ? ? ? ???* @author bardpub
  6. ? ? ? ???*/
  7. ? ? ? ? public class DES
  8. ? ? ? ? {
  9. ? ? ? ? ? ? ? ??
  10. ? ? ? ? ? ? ? ? private static var _instance:DES;
  11. ? ? ? ? ? ? ? ??
  12. ? ? ? ? ? ? ? ? // 置换选择表一 (PC-1)
  13. ? ? ? ? ? ? ? ? public static var bSelSwapTable_1:Array = [
  14. ? ? ? ? ? ? ? ? ? ? ? ? 57,49,41,33,25,17,??9,??1,58,50,42,34,26,18,?
  15. ? ? ? ? ? ? ? ? ? ? ? ? 10,??2,59,51,43,35,27,19,11,??3,60,52,44,36,
  16. ? ? ? ? ? ? ? ? ? ? ? ? 63,55,47,39,31,23,15,??7,62,54,46,38,30,22,
  17. ? ? ? ? ? ? ? ? ? ? ? ? 14,??6,61,53,45,37,29,21,13,??5,28,20,12,??4
  18. ? ? ? ? ? ? ? ? ] ;

  19. ? ? ? ? ? ? ? ? // 置换选择表二 (PC-2)
  20. ? ? ? ? ? ? ? ? public static var bSelSwapTable_2:Array = [
  21. ? ? ? ? ? ? ? ? ? ? ? ? 14,24,10,
  22. ? ? ? ? ? ? ? ? ? ? ? ? 23,??4,??8,16,
  23. ? ? ? ? ? ? ? ? ? ? ? ? 41,40,48,
  24. ? ? ? ? ? ? ? ? ? ? ? ? 44,56,32
  25. ? ? ? ? ? ? ? ? ] ;
  26. ? ? ? ? ? ? ? ??
  27. ? ? ? ? ? ? ? ? // 初始置换表 (IP)
  28. ? ? ? ? ? ? ? ? public static var??bInitSwapTable:Array = [
  29. ? ? ? ? ? ? ? ? ? ? ? ? 58,2,4,
  30. ? ? ? ? ? ? ? ? ? ? ? ? 62,14,6,64,32,8,
  31. ? ? ? ? ? ? ? ? ? ? ? ? 57,9,3,
  32. ? ? ? ? ? ? ? ? ? ? ? ? 61,5,63,7
  33. ? ? ? ? ? ? ? ? ] ;

  34. ? ? ? ? ? ? ? ? // 初始逆置换表 (IP-1)
  35. ? ? ? ? ? ? ? ? public static var bInitReSwapTable:Array = [
  36. ? ? ? ? ? ? ? ? ? ? ? ? 40,7,
  37. ? ? ? ? ? ? ? ? ? ? ? ? 38,
  38. ? ? ? ? ? ? ? ? ? ? ? ? 36,
  39. ? ? ? ? ? ? ? ? ? ? ? ? 34,1,57,25
  40. ? ? ? ? ? ? ? ? ] ;
  41. ? ? ? ? ? ? ? ??
  42. ? ? ? ? ? ? ? ? // 位扩展表32-->48 (E)
  43. ? ? ? ? ? ? ? ? public static var bBitExternTable:Array = [
  44. ? ? ? ? ? ? ? ? ? ? ? ? 32,
  45. ? ? ? ? ? ? ? ? ? ? ? ? 8,
  46. ? ? ? ? ? ? ? ? ? ? ? ? 16,
  47. ? ? ? ? ? ? ? ? ? ? ? ? 24,??1
  48. ? ? ? ? ? ? ? ? ] ;

  49. ? ? ? ? ? ? ? ? // 32位置换表--用于F的尾置换 (P)
  50. ? ? ? ? ? ? ? ? public static var bTailSwapTable:Array = [
  51. ? ? ? ? ? ? ? ? ? ? ? ? 16,
  52. ? ? ? ? ? ? ? ? ? ? ? ? 1,
  53. ? ? ? ? ? ? ? ? ? ? ? ? 2,
  54. ? ? ? ? ? ? ? ? ? ? ? ? 19,25
  55. ? ? ? ? ? ? ? ? ] ;
  56. ? ? ? ? ? ? ? ??
  57. ? ? ? ? ? ? ? ? //8个S盒
  58. ? ? ? ? ? ? ? ? public static var SB:Array = [
  59. ? ? ? ? ? ? ? ? [
  60. ? ? ? ? ? ? ? ? ? ? ? ? 14,
  61. ? ? ? ? ? ? ? ? ? ? ? ? 0,
  62. ? ? ? ? ? ? ? ? ? ? ? ? 4,
  63. ? ? ? ? ? ? ? ? ? ? ? ? 15,13
  64. ? ? ? ? ? ? ? ? ],
  65. ? ? ? ? ? ? ? ??
  66. ? ? ? ? ? ? ? ? [
  67. ? ? ? ? ? ? ? ? ? ? ? ? 15,
  68. ? ? ? ? ? ? ? ? ? ? ? ? 3,
  69. ? ? ? ? ? ? ? ? ? ? ? ? 13,9
  70. ? ? ? ? ? ? ? ? ],
  71. ? ? ? ??
  72. ? ? ? ? ? ? ? ? [
  73. ? ? ? ? ? ? ? ? ? ? ? ? 10,?
  74. ? ? ? ? ? ? ? ? ? ? ? ? 13,12
  75. ? ? ? ? ? ? ? ? ],
  76. ? ? ? ??
  77. ? ? ? ? ? ? ? ? [
  78. ? ? ? ? ? ? ? ? ? ? ? ? 7,
  79. ? ? ? ? ? ? ? ? ? ? ? ? 10,14
  80. ? ? ? ? ? ? ? ? ],
  81. ? ? ? ??
  82. ? ? ? ? ? ? ? ? [
  83. ? ? ? ? ? ? ? ? ? ? ? ? 2,
  84. ? ? ? ? ? ? ? ? ? ? ? ? 11,3
  85. ? ? ? ? ? ? ? ? ],
  86. ? ? ? ??
  87. ? ? ? ? ? ? ? ? [
  88. ? ? ? ? ? ? ? ? ? ? ? ? 12,
  89. ? ? ? ? ? ? ? ? ? ? ? ? 9,
  90. ? ? ? ??
  91. ? ? ? ? ? ? ? ? [
  92. ? ? ? ? ? ? ? ? ? ? ? ? 4,
  93. ? ? ? ? ? ? ? ? ? ? ? ? 6,
  94. ? ? ? ??
  95. ? ? ? ? ? ? ? ? [
  96. ? ? ? ? ? ? ? ? ? ? ? ? 13,
  97. ? ? ? ? ? ? ? ? ? ? ? ? 7,11
  98. ? ? ? ? ? ? ? ? ]] ;
  99. ? ? ? ? ? ? ? ??
  100. ? ? ? ? ? ? ? ? public function DES()?
  101. ? ? ? ? ? ? ? ? {
  102. ? ? ? ? ? ? ? ? ? ? ? ??
  103. ? ? ? ? ? ? ? ? }
  104. ? ? ? ? ? ? ? ??
  105. ? ? ? ? ? ? ? ? public static function getInstance():DES
  106. ? ? ? ? ? ? ? ? {
  107. ? ? ? ? ? ? ? ? ? ? ? ? if (_instance == null)
  108. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? _instance = new DES();
  109. ? ? ? ? ? ? ? ? ? ? ? ? return _instance;
  110. ? ? ? ? ? ? ? ? }
  111. ? ? ? ? ? ? ? ??
  112. ? ? ? ? ? ? ? ??
  113. ? ? ? ? ? ? ? ??
  114. ? ? ? ? }

  115. }
复制代码


然后声明几个变量,用来存储有关内容,
  1. private var _bKey:ByteArray;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //原始KEY (64 bit)
  2. private var _bSubKey:ByteArray;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //新的子KEY? ? ? ? ( 16 * 48 bit)
  3. private var _bOrigMsg:ByteArray;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //初始明文
  4. private var _lMsg:ByteArray;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //保存(L0-L16)
  5. private var _rMsg:ByteArray;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //保存R0-R16
  6. private var _bCryptedMsg:ByteArray;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //保存密文
复制代码


在DES的构造函数中初始化这些变量:
  1. _bKey = new ByteArray();
  2. _bKey.length = 8;
  3. _bSubKey = new ByteArray();
  4. _bSubKey.length = 96;
  5. ? ? ? ? ? ? ? ? ? ? ? ??
  6. _bOrigMsg = new ByteArray();
  7. _bOrigMsg.length = 8;
  8. ? ? ? ? ? ? ? ? ? ? ? ??
  9. _bCryptedMsg = new ByteArray();
  10. _bCryptedMsg.length = 8;
  11. ? ? ? ? ? ? ? ? ? ? ? ??
  12. _lMsg = new ByteArray();
  13. _rMsg = new ByteArray();
  14. _lMsg.length = _rMsg.length = 68;
复制代码

ByteArray是以字节位单位存储内容的,所以我们存储64位的数据块只需要长度为8的ByteArray对象,_bSubKey中我们要存储K1-K16的内容 ,每一个子密钥的位数是48位,6字节.因此需要6 * 16的长度。 _lMsg,_rMsg同理存储L0-L16,R0-R16 L为32位4字节,因此需要4 * 17 = 68字节长度来存储。 因为加密算法中都是以位为单位操作的,AS中没有直接操作位的语法(其实绝大多数语言都没有) 因此我们需要按位运算符来帮忙了。
这些东西对系统学过计算机的同学来说很容易了,如果是半路出家的可能平时没怎么接触过这些。因此我说得稍微啰嗦一点。

var b:ByteArray = new ByteArray();
b.writeByte(0);
这时b的内容用2进制表示就是:00000000 要想把某一位设为1需要使用 |(按位或运算符),它对操作数中相应的位进行或运算。如果两个对应的位中有一个是1,结果位就是1。如果两个位都是0,结果就是0
00000000 | 10000000 = 01000000
也就是 b | 0x80 = 10000000
同理 b | 0x40 = 01000000
? ?? ? b | 0x20 = 00100000
? ?? ? b | 0x10 = 00010000
? ?? ? b | 0x8 = 00001000
? ?? ? b | 0x4 = 00000100
? ?? ? b | 0x2 = 00000010
? ?? ? b | 0x1 = 00000001
再说一个小技巧 16进制与2进制的转换,以前我的老师把它称为8421码,一个2进制数转换为16进制 每4位转换为一个16进制数 从高到底第一位是如果该位上是1那么数值就是8 第2位是4 第3位是2 第4位是1, 把他们相加就是16进制的表示,如2进制数01001010 每4位一组 0100 1010
0 + 4 + 0 + 0 = 4 ;8 + 0 + 2 +0 = 10(A) 16进制数就是4A。


如果要把某位上设为0需要使用& (按位与运算符) 它对操作数中相应的位进行与运算。如果相应的位都是1,结果位就是1,否则就是0。
设b = 11101000,b & 0222221 = 0x01101000,这个02222211怎么来的呢 把10000000取反就行了,10000000 16进制是0x80,那么~0x80 = 02222211; ~是取反运算符,可以反转操作数中的位,即1变成0,0变成1。?
为了方便后面的操作 我们把0x80,0x40等等定义成DES类的一个属性数组:
//方便位操作的掩码
public static const BITMASK:Array = [0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80 ];

定义setter方法来添加密钥与明文
  1. ? ? ? ? ? ? ? ? /**
  2. ? ? ? ? ? ? ? ???* 设置初始密钥
  3. ? ? ? ? ? ? ? ???*/
  4. ? ? ? ? ? ? ? ? public function set bKey(value:ByteArray):void?
  5. ? ? ? ? ? ? ? ? {
  6. ? ? ? ? ? ? ? ? ? ? ? ? if (value.length < 8)
  7. ? ? ? ? ? ? ? ? ? ? ? ? {
  8. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? throw new Error("密钥必须为64位");
  9. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? return;
  10. ? ? ? ? ? ? ? ? ? ? ? ? }

  11. ? ? ? ? ? ? ? ? ? ? ? ? for (var i:int =??0; i < 8; i++ )
  12. ? ? ? ? ? ? ? ? ? ? ? ? {
  13. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? _bKey[i] = value[i];
  14. ? ? ? ? ? ? ? ? ? ? ? ? }
  15. ? ? ? ? ? ? ? ? }
  16. ? ? ? ? ? ? ? ??
  17. ? ? ? ? ? ? ? ? /**
  18. ? ? ? ? ? ? ? ???* 设置初始明文
  19. ? ? ? ? ? ? ? ???*/
  20. ? ? ? ? ? ? ? ? public function set bOrigMsg(value:ByteArray):void?
  21. ? ? ? ? ? ? ? ? {
  22. ? ? ? ? ? ? ? ? ? ? ? ? if (value.length < 8)
  23. ? ? ? ? ? ? ? ? ? ? ? ? {
  24. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? throw new Error("明文必须为64位");
  25. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? return;
  26. ? ? ? ? ? ? ? ? ? ? ? ? }
  27. ? ? ? ? ? ? ? ? ? ? ? ??
  28. ? ? ? ? ? ? ? ? ? ? ? ? for (var i:int =??0; i < 8; i++ )
  29. ? ? ? ? ? ? ? ? ? ? ? ? {
  30. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? _bOrigMsg[i] = value[i];
  31. ? ? ? ? ? ? ? ? ? ? ? ? }
  32. ? ? ? ? ? ? ? ? }
复制代码

如果输入的密钥长度小于64位则抛出错误,否则把密钥的内容复制到_bKey中。


定义一个辅助方法byteArraySet(byte,value:int),用来把byteArray对象的内容设为value
  1. /**
  2. ? ? ? ? ? ? ? ???* 把ByteArray对象的内容设为指定值
  3. ? ? ? ? ? ? ? ???* @param? ? ? ? value
  4. ? ? ? ? ? ? ? ???*/
  5. ? ? ? ? ? ? ? ? public function byteArraySet(byteArray:ByteArray,value:int):void?
  6. ? ? ? ? ? ? ? ? {
  7. ? ? ? ? ? ? ? ? ? ? ? ? byteArray.position = 0;
  8. ? ? ? ? ? ? ? ? ? ? ? ? for (var i:int = 0,len:int = byteArray.length; i < len; i++ )
  9. ? ? ? ? ? ? ? ? ? ? ? ? {
  10. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? byteArray.writeByte(value);
  11. ? ? ? ? ? ? ? ? ? ? ? ? }
  12. ? ? ? ? ? ? ? ? }
复制代码


定义一个genSubKey方法用来生成子密钥: public function genSubKey():void {};
首先我们把_bSubKey的内容清空,
byteArraySet(_bSubKey,0);
然后对初始密钥使用PC-1表进行置换,定义一个bTemp的byteArray对象来存储置换后的内容,
置换思路是这样的:依次检查_bKey中的PC-1表中索引的位,如果该位为1,则把bTemp中当前次数的位设为1,否则不做任何操作(因为我们初始化bTemp的时候,bTemp内容全部为0)。那么如何检查_bKey中指定的位是否为1呢?我们使用&(按位与运算符),这是按位与运算符,它对操作数中相应的位进行与运算。如果相应的位都是1,结果位就是1,否则就是0。
如果我们要检查0010 0001块中第3位是否为1,那么0010 0001 & 0010 0000结果为0010 0000,结果不为0表示0010 0001第3位是1,否则就是0。
这样我们需要检查_bKey中第10位是否为1那么 _bKey[int((10-1)/8)] & 0100 0000就是结果了(bKey中的元素是以字节为单位的,第10位那就处在第2个字节中的第2位,也就是_bKey[1]中的第2位,那么_bKey[1] & 0x40的结果如果不为0那么_bkey的第10位就是1,否则就是0。

  1. var byteIndex:int,bitIndex:int,bTemp:ByteArray;
  2. bTemp = new ByteArray();
  3. bTemp.length = 7;
  4. //置换选择1,对初始密钥使用PC-1置换
  5. for (var i:int = 0; i < 56; i++ )
  6. ? ? ? ? ? ? ? ? ? ? ? ? {?
  7. ? ?? ?? ?? ???
  8. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? byteIndex = (bSelSwapTable_1[i] - 1) / 8;
  9. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? bitIndex = 7 - (bSelSwapTable_1[i] - 1) % 8;
  10. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
  11. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if (_bKey[byteIndex] & BITMASK[bitIndex])
  12. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {
  13. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? bTemp[int(i / 8)] |= BITMASK[7 - i % 8];
  14. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
  15. ? ? ? ? ? ? ? ? ? ? ? ? }
复制代码


byteIndex = (bSelSwapTable_1?- 1) / 8; 取得当前要检查的位在_bkey中的索引位置。
bitIndex = 7 - (bSelSwapTable_1?- 1) % 8; 取得当前要检查的为在_bkey中某索引的第几个位置
if (_bKey[byteIndex] & BITMASK[bitIndex])
如果当前位不为1,那么把bTemp中当前位设为1:
bTemp[int(i / 8)] |= BITMASK[7 - i % 8];

然后要经过16轮变换产生子密钥

先定一个bTempkey用来存储每轮变化时产生的值
  1. var tmpLen:int = 0;
  2. ? ? ? ? ? ? ? ? ? ? ? ? //经过16轮变换产生子密钥
  3. ? ? ? ? ? ? ? ? ? ? ? ? for (var iTurn:int = 1; iTurn <= 16; iTurn++ )
  4. ? ? ? ? ? ? ? ? ? ? ? ? {
  5. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? var bShiftBit:int = 2;
  6. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if (iTurn == 1 || iTurn == 2 || iTurn == 9 || iTurn == 16)
  7. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {
  8. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? bShiftBit = 1;
  9. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
  10. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
  11. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? tmpLen = bShiftBit + 28;
  12. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
  13. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //循环移位
  14. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? for (i = bShiftBit;??i < tmpLen; i++ )
  15. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {
  16. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
  17. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //生成C(n)
  18. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if (bTemp[int(i % 28 / 8)] & BITMASK[7 - (i % 28) % 8])
  19. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {
  20. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? bTempKey[int((i - bShiftBit) / 8)] |= BITMASK[7 - (i - bShiftBit) % 8];
  21. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
  22. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
  23. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //生成D(n)
  24. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if (bTemp[int((i % 28 + 28) / 8)] & BITMASK[7 - (i % 28 + 28) % 8])
  25. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {
  26. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? bTempKey[int((i + 28 - bShiftBit) / 8)] |= BITMASK[7 - (i + 28 - bShiftBit) % 8];
  27. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
  28. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
  29. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
  30. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
  31. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
  32. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
  33. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //置换2
  34. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? for (i = 0; i < 48; i++ )
  35. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {
  36. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? byteIndex = (bSelSwapTable_2[i] - 1) / 8;
  37. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? bitIndex = 7 - (bSelSwapTable_2[i] - 1) % 8;
  38. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
  39. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if (bTempKey[byteIndex] & BITMASK[bitIndex])
  40. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {
  41. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? _bSubKey[int(i / 8) + (iTurn - 1) * 6] |= BITMASK[7 - (i % 8)];
  42. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }?
  43. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
  44. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? byteArrayCpy(bTemp,bTempKey);
  45. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? byteArraySet(bTempKey,0);?
  46. ? ? ? ? ? ? ? ? ? ? ? ? }
复制代码


首先按当前的轮数得到是左移一位还是两位
  1. var bShiftBit:int = 2;
  2. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if (iTurn == 1 || iTurn == 2 || iTurn == 9 || iTurn == 16)
  3. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {
  4. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? bShiftBit = 1;
  5. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
复制代码


然后把bTemp分为Cn Dn(28位)进行循环,把结果存在bTempkey中,循环28次,如果移位数是1那么依次取出bTemp的2-3-4-5…28-1位的值设为bTempkey的1-28位的值, Dn就是Cn的基础上+上28就是了
  1. tmpLen = bShiftBit + 28;
  2. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
  3. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //循环移位
  4. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? for (i = bShiftBit;??i < tmpLen; i++ )
  5. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {
  6. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
  7. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //生成C(n)
  8. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if (bTemp[int(i % 28 / 8)] & BITMASK[7 - (i % 28) % 8])
  9. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {
  10. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? bTempKey[int((i - bShiftBit) / 8)] |= BITMASK[7 - (i - bShiftBit) % 8];
  11. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
  12. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
  13. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //生成D(n)
  14. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if (bTemp[int((i % 28 + 28) / 8)] & BITMASK[7 - (i % 28 + 28) % 8])
  15. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {
  16. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? bTempKey[int((i + 28 - bShiftBit) / 8)] |= BITMASK[7 - (i + 28 - bShiftBit) % 8];
  17. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
  18. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
  19. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
复制代码


然后把CnDn用PC-2表进行置换 存储在_bSubKey中
  1. //置换2
  2. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? for (i = 0; i < 48; i++ )
  3. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {
  4. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? byteIndex = (bSelSwapTable_2[i] - 1) / 8;
  5. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? bitIndex = 7 - (bSelSwapTable_2[i] - 1) % 8;
  6. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
  7. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if (bTempKey[byteIndex] & BITMASK[bitIndex])
  8. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {
  9. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? _bSubKey[int(i / 8) + (iTurn - 1) * 6] |= BITMASK[7 - (i % 8)];
  10. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }?
  11. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
复制代码


最后把bTempKey的值复制到bTemp中,把bTemp的值清空,开始新一轮的循环
  1. byteArrayCpy(bTemp,bTempKey);
  2. byteArraySet(bTempKey,0);
复制代码


新建一个initSwap方法对明文进行初始置换
  1. /**
  2. ? ? ? ? ? ? ? ???* 根据IP表对明文M进行初始置换
  3. ? ? ? ? ? ? ? ???*/
  4. ? ? ? ? ? ? ? ? public function initSwap():void?
  5. ? ? ? ? ? ? ? ? {
  6. ? ? ? ? ? ? ? ? ? ? ? ? byteArraySet(_lMsg,0);
  7. ? ? ? ? ? ? ? ? ? ? ? ? byteArraySet(_rMsg,0);
  8. ? ? ? ? ? ? ? ? ? ? ? ? var byteIndex:int,bitIndex:int;
  9. ? ? ? ? ? ? ? ? ? ? ? ? for (var i:int = 0; i < 32; i++ )
  10. ? ? ? ? ? ? ? ? ? ? ? ? {
  11. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? byteIndex = (bInitSwapTable[i] - 1) / 8;
  12. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? bitIndex = 7 - (bInitSwapTable[i] - 1) % 8;
  13. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if (_bOrigMsg[byteIndex] & BITMASK[bitIndex])
  14. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {
  15. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? _lMsg[ int(i / 8)] |= BITMASK[7 - (i % 8)];
  16. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
  17. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
  18. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? byteIndex = (bInitSwapTable[i+32] - 1) / 8;
  19. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? bitIndex = 7 - (bInitSwapTable[i + 32] - 1) % 8;
  20. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if (_bOrigMsg[byteIndex] & BITMASK[bitIndex])
  21. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {
  22. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? _rMsg[ int(i / 8)] |= BITMASK[7 - (i % 8)];
  23. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
  24. ? ? ? ? ? ? ? ? ? ? ? ? }
  25. ? ? ? ? ? ? ? ? }
复制代码

思路跟前面置换密钥是一样的,就不多说了.

新建一个singleTurn方法进行单轮转换
  1. /**
  2. ? ? ? ? ? ? ? ???* 单轮加密
  3. ? ? ? ? ? ? ? ???* @param? ? ? ? iTurn
  4. ? ? ? ? ? ? ? ???* @param? ? ? ? mode
  5. ? ? ? ? ? ? ? ???*/
  6. ? ? ? ? ? ? ? ? public function singleTurn(iTurn:int,mode:Boolean):void?
  7. ? ? ? ? ? ? ? ? {
  8. ? ? ? ? ? ? ? ? ? ? ? ? //L(n) = R(n-1)
  9. ? ? ? ? ? ? ? ? ? ? ? ? for (var i:int = 0; i < 4; i++ )
  10. ? ? ? ? ? ? ? ? ? ? ? ? {
  11. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? _lMsg[i + iTurn * 4] = _rMsg[i + (iTurn - 1) * 4];
  12. ? ? ? ? ? ? ? ? ? ? ? ? }
  13. ? ? ? ? ? ? ? ? ? ? ? ??
  14. ? ? ? ? ? ? ? ? ? ? ? ? F(iTurn,mode);
  15. ? ? ? ? ? ? ? ? ? ? ? ??
  16. ? ? ? ? ? ? ? ? ? ? ? ? for (i = 0; i < 4; i++ )
  17. ? ? ? ? ? ? ? ? ? ? ? ? {
  18. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? _rMsg[i + iTurn * 4] ^= _lMsg[i + (iTurn - 1) * 4];
  19. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
  20. ? ? ? ? ? ? ? ? ? ? ? ? }
  21. ? ? ? ? ? ? ? ? ? ? ? ??
  22. ? ? ? ? ? ? ? ? ? ? ? ??
  23. ? ? ? ? ? ? ? ? }
复制代码


//L(n) = R(n-1)
? ? ? ? ? ? ? ? ? ? ? ? for (var i:int = 0; i < 4; i++ )
? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? _lMsg[i + iTurn * 4] = _rMsg[i + (iTurn - 1) * 4];
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? 把Rn-1的值复制到Ln中(Ln存储在_Lmsg[n] 到_lmsg[n+4]中,Rn同样);

然后使用F函数对R(n-1)与Kn进行处理.F函数稍后讲解
F(iTurn,mode);
最后确定Rn的值(与Ln-1进行XOR操作)
for (var i:int = 0; i < 4; i++ )
? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? _lMsg[i + iTurn * 4] = _rMsg[i + (iTurn - 1) * 4];
? ? ? ? ? ? ? ? ? ? ? ? }


DES算法的关键部分就是F函数的实现,F函数输入的是右部的32位,首先通过扩展置换表,把32位扩展为48位,使他与子密钥长度相同,然后与子密钥进行XOR操作,再经过S盒处理,最后经过尾置换输出.

S盒的作用是把48位变成通过非线性转换为32位输出,总用有8个S盒,每一个S盒的作用是把6位变成4位输出,其中第1位和第6位组合作为行索引值,中间4位组合作为列索引值,例如对S盒输入的是101110,于是行索引=10(2进制)=2,列索引=0111(2进制) = 7, S1(2,7)=11 = 1011(2进制),经过S盒之后还有一个尾置换.
  1. /**
  2. ? ? ? ? ? ? ? ???* F函数
  3. ? ? ? ? ? ? ? ???* @param? ? ? ? iTurn? ? ? ? 转换轮数
  4. ? ? ? ? ? ? ? ???* @param? ? ? ? mode? ? ? ? 方式(加密OR解密)
  5. ? ? ? ? ? ? ? ???*/
  6. ? ? ? ? ? ? ? ? public function F(iTurn:int,mode:Boolean):void?
  7. ? ? ? ? ? ? ? ? {
  8. ? ? ? ? ? ? ? ? ? ? ? ? var bTemp:ByteArray = new ByteArray();
  9. ? ? ? ? ? ? ? ? ? ? ? ? bTemp.length = 6;
  10. ? ? ? ? ? ? ? ? ? ? ? ? var C:ByteArray = new ByteArray();
  11. ? ? ? ? ? ? ? ? ? ? ? ? C.length = 4;
  12. ? ? ? ? ? ? ? ? ? ? ? ??
  13. ? ? ? ? ? ? ? ? ? ? ? ? var byteIndex:int,bitIndex:int;
  14. ? ? ? ? ? ? ? ? ? ? ? ??
  15. ? ? ? ? ? ? ? ? ? ? ? ? //R --> E(R) 保存在bTemp中
  16. ? ? ? ? ? ? ? ? ? ? ? ? for (var i:int = 0; i < 48; i++ )
  17. ? ? ? ? ? ? ? ? ? ? ? ? {
  18. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? byteIndex = (bBitExternTable[i] - 1) / 8;
  19. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? bitIndex = 7 - (bBitExternTable[i] - 1) % 8;
  20. ? ? ? ? ? ? ? ? ? ? ? ??
  21. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if (_rMsg[byteIndex + (iTurn - 1) * 4] & BITMASK[bitIndex])
  22. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {
  23. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? bTemp[int(i / 8)] |= BITMASK[7 - i % 8];
  24. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
  25. ? ? ? ? ? ? ? ? ? ? ? ? }
  26. ? ? ? ??
  27. ? ? ? ? ? ? ? ? ? ? ? ? //E(R) --> K 保存在bTemp中
  28. ? ? ? ? ? ? ? ? ? ? ? ? for (i = 0; i < 6; i++ )
  29. ? ? ? ? ? ? ? ? ? ? ? ? {
  30. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if (mode)
  31. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {
  32. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? bTemp[i] ^= _bSubKey[(iTurn - 1) * 6 + i];
  33. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
  34. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? else?
  35. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {
  36. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? bTemp[i] ^= _bSubKey[96 - iTurn * 6 + i];
  37. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
  38. ? ? ? ? ? ? ? ? ? ? ? ? }
  39. ? ? ? ? ? ? ? ??
  40. ? ? ? ? ? ? ? ? ? ? ? ? var bStartPos:int = 0,bTarPos:int = 0;
  41. ? ? ? ?? ?? ?? ?var bRowIndex:int = 0,bColIndex:int = 0 ;? ? ? ? //保存行数与列数
  42. ? ? ? ? ? ? ? ? ? ? ? ? for (var bBoxIndex:int = 0; bBoxIndex < 8; bBoxIndex ++ )
  43. ? ? ? ? ? ? ? ? ? ? ? ? {
  44. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 确定行值
  45. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if ( bTemp[int(bStartPos / 8)] & BITMASK[(~bStartPos) & 7] )
  46. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {
  47. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? bColIndex += 2 ;
  48. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
  49. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
  50. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if ( bTemp[int((bStartPos + 5) / 8)] & BITMASK[(~(bStartPos + 5)) & 7] )
  51. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {
  52. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? bColIndex += 1 ;
  53. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
  54. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
  55. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 确定列值
  56. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if ( bTemp[int((bStartPos+1)/8)] & BITMASK[(~(bStartPos+1))&7] )
  57. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? bRowIndex += 8 ;
  58. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if ( bTemp[int((bStartPos+2)/8)] & BITMASK[(~(bStartPos+2))&7] )
  59. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? bRowIndex += 4 ;
  60. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if ( bTemp[int((bStartPos+3)/8)] & BITMASK[(~(bStartPos+3))&7] )
  61. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? bRowIndex += 2 ;
  62. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if ( bTemp[int((bStartPos+4)/8)] & BITMASK[(~(bStartPos+4))&7] )
  63. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? bRowIndex += 1 ;
  64. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
  65. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 取出S(i)盒中由上面行列所对应的值bTarValue
  66. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? var bTarValue:int = SB[bBoxIndex][bColIndex * 16 + bRowIndex];
  67. ? ? ? ? ? ? ? ? ? ? ? ??
  68. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
  69. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 把bTarValue转化成对应的C(i)
  70. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if ( bTarValue >= 8 )
  71. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {
  72. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? C[int(bTarPos/8)] |= BITMASK[(~bTarPos)&7] ;
  73. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? bTarValue -= 8 ;
  74. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
  75. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if ( bTarValue >= 4 )
  76. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {
  77. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? C[int((bTarPos+1)/8)] |= BITMASK[(~(bTarPos+1))&7] ;
  78. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? bTarValue -= 4 ;
  79. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
  80. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if ( bTarValue >= 2 )
  81. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {
  82. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? C[int((bTarPos+2)/8)] |= BITMASK[(~(bTarPos+2))&7] ;
  83. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? bTarValue -= 2 ;
  84. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
  85. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if ( bTarValue >= 1 )
  86. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {
  87. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? C[int((bTarPos+3)/8)] |= BITMASK[(~(bTarPos+3))&7] ;
  88. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? bTarValue -= 1 ;
  89. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
  90. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
  91. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? bRowIndex? ? ? ? = bColIndex = 0 ;
  92. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? bStartPos? ? ? ? += 6 ;
  93. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? bTarPos? ? ? ? ? ? ? ? += 4 ;
  94. ? ? ? ? ? ? ? ? ? ? ? ? }
  95. ? ? ? ? ? ? ? ? ? ? ? ??
  96. ? ? ? ? ? ? ? ? ? ? ? ? // 尾置换
  97. ? ? ? ? ? ? ? ? ? ? ? ? for ( i = 0; i < 32; i++ )
  98. ? ? ? ? ? ? ? ? ? ? ? ? {
  99. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if ( C[int((bTailSwapTable[i]-1)/8)] & BITMASK[(~(bTailSwapTable[i]-1))&7] )
  100. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? _rMsg[iTurn *??4 + int(i /8)] |= BITMASK[(~i)&7] ;
  101. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? else
  102. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? _rMsg[iTurn *??4 + int(i /8)] &= ( ~(BITMASK[(~i)&7]) );
  103. ? ? ? ? ? ? ? ? ? ? ? ? }

  104. ? ? ? ? ? ? ? ? }
  105. ? ? ? ? ? ? ? ??
  106. ? ? ? ? ? ? ? ??
  107. ? ? ? ? }
复制代码

[?本帖最后由 bardpub 于 2010-7-22 22:06 编辑?]
附件: ? 你需要登录才可以下载或查看附件。没有帐号?注册?

相关帖子

  • 关于flash加密问题
  • 3d滚屏魔方动画flash源码
  • flash多点触摸屏模拟器
  • 使用flash as3 通过二进制[bytearray]判断真实的文件类型。
  • php加密解密内部算法
  • 想做一个flash相册,as3.0的,求高手帮忙!!!
  • 求一个算法
  • js可否实现类似flash蒙版效果,望赐教!
  • 在word中实现简单flash 3d特效
  • 新手,对flash的一些疑问。
查看更多>>

flash as3.0 md5 加密算法怎么获得flash里面的加密算法as 3.0基础图片反转鼠标跟随flash加密算法flash游戏flash模块flash 密码adobe flash player

已有?1?人评分 威望 收起理由

?jimohuoshan
+ 5 期待楼主完整篇

总评分:?威望 + 5? ?查看全部评分

分享0

收藏17

支持0

反对0
?

使用道具?举报

? ?

? bardpub  楼主

中级会员?

?

帖子
41
体力
124
威望
17
居住地
安徽省 蚌埠市
  • 加好友
  • 发消息
2#

? 发表于 2010-7-21 16:17:36 ? | 只看该作者
注意到这里常出现的BITMASK[(~(i))&7],它其实就是BITMASK[7 - (i % 8)];因为位操作要比加减乘除要快得多,你可以把前面的操作都这样改过来,还有一个可以优化的地方就是int(i / 8)
可以改为 i >> 3;

最后创建一个函数initReSwap进行逆置换,生成密文
  1. /**
  2. ? ? ? ? ? ? ? ???* 初始逆置换
  3. ? ? ? ? ? ? ? ???*/
  4. ? ? ? ? ? ? ? ? public function initReSwap():void?
  5. ? ? ? ? ? ? ? ? {
  6. ? ? ? ? ? ? ? ? ? ? ? ? byteArraySet(_bCryptedMsg,0);
  7. ? ? ? ? ? ? ? ??
  8. ? ? ? ? ? ? ? ? ? ? ? ? for ( var i:int = 0; i < 64; i++ )
  9. ? ? ? ? ? ? ? ? ? ? ? ? {
  10. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
  11. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if (bInitReSwapTable[i] <= 32)
  12. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {
  13. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if (_rMsg[64 + int((bInitReSwapTable[i] - 1) / 8)] &
  14. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ???BITMASK[(~(bInitReSwapTable[i] - 1)) & 7])
  15. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {
  16. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? _bCryptedMsg[int(i / 8)] |= BITMASK[(~i) & 7];
  17. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
  18. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? else?
  19. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {
  20. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? _bCryptedMsg[int(i / 8)] &= ( ~(BITMASK[(~i)&7]) ) ;
  21. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
  22. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
  23. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
  24. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? else?
  25. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {
  26. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if (_lMsg[64 + int((bInitReSwapTable[i] - 1 - 32) / 8)] &
  27. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ???BITMASK[(~(bInitReSwapTable[i] - 32 - 1)) & 7])
  28. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {
  29. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? _bCryptedMsg[int(i / 8)] |= BITMASK[(~i) & 7];
  30. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
  31. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? else?
  32. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {
  33. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? _bCryptedMsg[int(i / 8)] &= ( ~(BITMASK[(~i)&7]) ) ;
  34. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
  35. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
  36. ? ? ? ? ? ? ? ? ? ? ? ? }
  37. ? ? ? ? ? ? ? ??
  38. ? ? ? ? ? ? ? ? ? ? ? ??
  39. ? ? ? ? ? ? ? ? }
  40. ? ? ? ? ? ? ? ??
  41. ? ? ? ? }
复制代码
最终我们的DES加密类就完成了,记得给&not;_ bCryptedMsg设置一个getter 加密的时候对明文以64位进行分组,不足64的0补齐

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读