NCR的Shuffle(混淆)算法,做ATM的很多都知道,并且都使用有封装好的现成接口,但是基本没有多少人知道其算法原理,所以将原理写在这,给需要的人提供些许帮助。
以下为举例。比如
要Shuffle的数据(J):0123456789 123456
参与Shuffle的Key(K):12345678
Basic Shuffle Key(L):19F2 C827 6AD0 839B
其中对于J/K/L的计算都是从后往前算的,即对于J是从6开始,最后到0;K是从8到1。
说明:下面的数字没有说明的,默认指10进制数字。
定义:m为int,初值为0
基本算法:
1、J的6与K的8相加,等于14,然后与m相加。此时m为初值0,仍然为14。
2、14除以10,得到除数为1,赋给m,此时m为1,余数为4。
3、将L的最后一位“B”由16进制转成10进制,则为11。用11和上面的4异或,得到15。15转为16进制为“F”,再和0X30相加,得到0X3F。将0X3F转成ASCII码,为“:”。
4、至此,Shuffle处理的最后一位完成。
5、接着是倒数第二位计算,过程与上面一样,唯一的区别是m是可能发生了变化的,为0或1。
6、等到算到第9位后,m值恒为0,因为K的长度只为8位。
计算过程见下表:
次数 |
计算过程 |
m |
Basic Shuffle Key(L) |
异或(余数和L) |
输出(ASCII码) |
1 |
6+8+0 |
1 |
B |
4与B |
3F(?) |
2 |
5+7+1 |
1 |
9 |
3与9 |
3A(:) |
3 |
4+6+1 |
1 |
3 |
1与3 |
32(2) |
4 |
3+5+1 |
0 |
8 |
9与8 |
31(1) |
5 |
2+4+0 |
0 |
0 |
6与0 |
36(6) |
6 |
1+3+0 |
0 |
D |
4与D |
39(9) |
7 |
2+9+0 |
1 |
A |
1与A |
3B(;) |
8 |
1+8+1 |
1 |
6 |
0与6 |
36(6) |
9 |
7+0+1 |
0 |
7 |
8与7 |
3F(?) |
10 |
…… |
……. |
|
|
…….. |
程序(待续):