📄 bbs水木清华站∶精华区readme.htm
字号:
href="mailto:mfischer@heinous.isca.uiowa.edu>">mfischer@heinous.isca.uiowa.edu></A> <BR> <BR> <BR>Here's how to do it, step by step: <BR> <BR> 1 Process the key. <BR> <BR> 1.1 Get a 64-bit key from the user. (Every 8th bit is considered a <BR>parity bit. For a key to have correct parity, each byte should contain <BR>an odd number of "1" bits.) <BR> <BR> 1.2 Calculate the key schedule. <BR> <BR> 1.2.1 Perform the following permutation on the 64-bit key. (The parity <BR>bits are discarded, reducing the key to 56 bits. Bit 1 of the permuted <BR>block is bit 57 of the original key, bit 2 is bit 49, and so on with bit <BR>56 being bit 4 of the original key.) <BR> <BR> Permuted Choice 1 (PC-1) <BR> <BR> 57 49 41 33 25 17 9 <BR> 1 58 50 42 34 26 18 <BR> 10 2 59 51 43 35 27 <BR> 19 11 3 60 52 44 36 <BR> 63 55 47 39 31 23 15 <BR> 7 62 54 46 38 30 22 <BR> 14 6 61 53 45 37 29 <BR> 21 13 5 28 20 12 4 <BR> <BR> 1.2.2 Split the permuted key into two halves. The first 28 bits are <BR>called C[0] and the last 28 bits are called D[0]. <BR> <BR> 1.2.3 Calculate the 16 subkeys. Start with i = 1. <BR> <BR> 1.2.3.1 Perform one or two circular left shifts on both C[i-1] and <BR>D[i-1] to get C[i] and D[i], respectively. The number of shifts per <BR>iteration are given in the table below. <BR> <BR> Iteration # 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <BR> Left Shifts 1 1 2 2 2 2 2 2 1 2 2 2 2 2 2 1 <BR> <BR> 1.2.3.2 Permute the concatenation C[i]D[i] as indicated below. This <BR>will yield K[i], which is 48 bits long. <BR> <BR> Permuted Choice 2 (PC-2) <BR> <BR> 14 17 11 24 1 5 <BR> 3 28 15 6 21 10 <BR> 23 19 12 4 26 8 <BR> 16 7 27 20 13 2 <BR> 41 52 31 37 47 55 <BR> 30 40 51 45 33 48 <BR> 44 49 39 56 34 53 <BR> 46 42 50 36 29 32 <BR> <BR> 1.2.3.3 Loop back to 1.2.3.1 until K[16] has been calculated. <BR> <BR> 2 Process a 64-bit data block. <BR> <BR> 2.1 Get a 64-bit data block. If the block is shorter than 64 bits, it <BR>should be padded as appropriate for the application. <BR> <BR> 2.2 Perform the following permutation on the data block. <BR> <BR> Initial Permutation (IP) <BR> <BR> 58 50 42 34 26 18 10 2 <BR> 60 52 44 36 28 20 12 4 <BR> 62 54 46 38 30 22 14 6 <BR> 64 56 48 40 32 24 16 8 <BR> 57 49 41 33 25 17 9 1 <BR> 59 51 43 35 27 19 11 3 <BR> 61 53 45 37 29 21 13 5 <BR> 63 55 47 39 31 23 15 7 <BR> <BR> 2.3 Split the block into two halves. The first 32 bits are called L[0], <BR>and the last 32 bits are called R[0]. <BR> <BR> 2.4 Apply the 16 subkeys to the data block. Start with i = 1. <BR> <BR> 2.4.1 Expand the 32-bit R[i-1] into 48 bits according to the <BR>bit-selection function below. <BR> <BR> Expansion (E) <BR> <BR> 32 1 2 3 4 5 <BR> 4 5 6 7 8 9 <BR> 8 9 10 11 12 13 <BR> 12 13 14 15 16 17 <BR> 16 17 18 19 20 21 <BR> 20 21 22 23 24 25 <BR> 24 25 26 27 28 29 <BR> 28 29 30 31 32 1 <BR> <BR> 2.4.2 Exclusive-or E(R[i-1]) with K[i]. <BR> <BR> 2.4.3 Break E(R[i-1]) xor K[i] into eight 6-bit blocks. Bits 1-6 are <BR>B[1], bits 7-12 are B[2], and so on with bits 43-48 being B[8]. <BR> <BR> 2.4.4 Substitute the values found in the S-boxes for all B[j]. Start <BR>with j = 1. All values in the S-boxes should be considered 4 bits wide. <BR> <BR> 2.4.4.1 Take the 1st and 6th bits of B[j] together as a 2-bit value <BR>(call it m) indicating the row in S[j] to look in for the substitution. <BR> <BR> 2.4.4.2 Take the 2nd through 5th bits of B[j] together as a 4-bit <BR>value (call it n) indicating the column in S[j] to find the substitution. <BR> <BR> 2.4.4.3 Replace B[j] with S[j][m][n]. <BR> <BR> Substitution Box 1 (S[1]) <BR> <BR> 14 4 13 1 2 15 11 8 3 10 6 12 5 9 0 7 <BR> 0 15 7 4 14 2 13 1 10 6 12 11 9 5 3 8 <BR> 4 1 14 8 13 6 2 11 15 12 9 7 3 10 5 0 <BR> 15 12 8 2 4 9 1 7 5 11 3 14 10 0 6 13 <BR> <BR> S[2] <BR> <BR> 15 1 8 14 6 11 3 4 9 7 2 13 12 0 5 10 <BR> 3 13 4 7 15 2 8 14 12 0 1 10 6 9 11 5 <BR> 0 14 7 11 10 4 13 1 5 8 12 6 9 3 2 15 <BR> 13 8 10 1 3 15 4 2 11 6 7 12 0 5 14 9 <BR> <BR> S[3] <BR> <BR> 10 0 9 14 6 3 15 5 1 13 12 7 11 4 2 8 <BR> 13 7 0 9 3 4 6 10 2 8 5 14 12 11 15 1 <BR> 13 6 4 9 8 15 3 0 11 1 2 12 5 10 14 7 <BR> 1 10 13 0 6 9 8 7 4 15 14 3 11 5 2 12 <BR> <BR> S[4] <BR> <BR> 7 13 14 3 0 6 9 10 1 2 8 5 11 12 4 15 <BR> 13 8 11 5 6 15 0 3 4 7 2 12 1 10 14 9 <BR> 10 6 9 0 12 11 7 13 15 1 3 14 5 2 8 4 <BR> 3 15 0 6 10 1 13 8 9 4 5 11 12 7 2 14 <BR> <BR> S[5] <BR> <BR> 2 12 4 1 7 10 11 6 8 5 3 15 13 0 14 9 <BR> 14 11 2 12 4 7 13 1 5 0 15 10 3 9 8 6 <BR> 4 2 1 11 10 13 7 8 15 9 12 5 6 3 0 14 <BR> 11 8 12 7 1 14 2 13 6 15 0 9 10 4 5 3 <BR> <BR> S[6] <BR> <BR> 12 1 10 15 9 2 6 8 0 13 3 4 14 7 5 11 <BR> 10 15 4 2 7 12 9 5 6 1 13 14 0 11 3 8 <BR> 9 14 15 5 2 8 12 3 7 0 4 10 1 13 11 6 <BR> 4 3 2 12 9 5 15 10 11 14 1 7 6 0 8 13 <BR> <BR> S[7] <BR> <BR> 4 11 2 14 15 0 8 13 3 12 9 7 5 10 6 1 <BR> 13 0 11 7 4 9 1 10 14 3 5 12 2 15 8 6 <BR> 1 4 11 13 12 3 7 14 10 15 6 8 0 5 9 2 <BR> 6 11 13 8 1 4 10 7 9 5 0 15 14 2 3 12 <BR> <BR> S[8] <BR> <BR> 13 2 8 4 6 15 11 1 10 9 3 14 5 0 12 7 <BR> 1 15 13 8 10 3 7 4 12 5 6 11 0 14 9 2 <BR> 7 11 4 1 9 12 14 2 0 6 10 13 15 3 5 8 <BR> 2 1 14 7 4 10 8 13 15 12 9 0 3 5 6 11 <BR> <BR> 2.4.4.4 Loop back to 2.4.4.1 until all 8 blocks have been replaced. <BR> <BR> 2.4.5 Permute the concatenation of B[1] through B[8] as indicated below. <BR> <BR> Permutation P <BR> <BR> 16 7 20 21 <BR> 29 12 28 17 <BR> 1 15 23 26 <BR> 5 18 31 10 <BR> 2 8 24 14 <BR> 32 27 3 9 <BR> 19 13 30 6 <BR> 22 11 4 25 <BR> <BR> 2.4.6 Exclusive-or the resulting value with L[i-1]. Thus, all together, <BR>your R[i] = L[i-1] xor P(S[1](B[1])...S[8](B[8])), where B[j] is a 6-bit <BR>block of E(R[i-1]) xor K[i]. (The function for R[i] is written as, R[i] = <BR>L[i-1] xor f(R[i-1], K[i]).) <BR> <BR> 2.4.7 L[i] = R[i-1]. <BR> <BR> 2.4.8 Loop back to 2.4.1 until K[16] has been applied. <BR> <BR> 2.5 Perform the following permutation on the block R[16]L[16]. <BR> <BR> Final Permutation (IP**-1) <BR> <BR> 40 8 48 16 56 24 64 32 <BR> 39 7 47 15 55 23 63 31 <BR> 38 6 46 14 54 22 62 30 <BR> 37 5 45 13 53 21 61 29 <BR> 36 4 44 12 52 20 60 28 <BR> 35 3 43 11 51 19 59 27 <BR> 34 2 42 10 50 18 58 26 <BR> 33 1 41 9 49 17 57 25 <BR> <BR> <BR>This has been a description of how to use the DES algorithm to encrypt <BR>one 64-bit block. To decrypt, use the same process, but just use the keys <BR>K[i] in reverse order. That is, instead of applying K[1] for the first <BR>iteration, apply K[16], and then K[15] for the second, on down to K[1]. <BR> <BR>Summaries: <BR> <BR> Key schedule: <BR> C[0]D[0] = PC1(key) <BR> for 1 <= i <= 16 <BR> C[i] = LS[i](C[i-1]) <BR> D[i] = LS[i](D[i-1]) <BR> K[i] = PC2(C[i]D[i]) <BR> <BR> Encipherment: <BR> L[0]R[0] = IP(plain block) <BR> for 1 <= i <= 16 <BR> L[i] = R[i-1] <BR> R[i] = L[i-1] xor f(R[i-1], K[i]) <BR> cipher block = FP(R[16]L[16]) <BR> <BR> Decipherment: <BR> R[16]L[16] = IP(cipher block) <BR> for 1 <= i <= 16 <BR> R[i-1] = L[i] <BR> L[i-1] = R[i] xor f(L[i], K[i]) <BR> plain block = FP(L[0]R[0]) <BR> <BR> <BR>To encrypt or decrypt more than 64 bits there are four official modes <BR>(defined in FIPS PUB 81). One is to go through the above-described <BR>process for each block in succession. This is called Electronic Codebook <BR>(ECB) mode. A stronger method is to exclusive-or each plaintext block <BR>with the preceding ciphertext block prior to encryption. (The first <BR>block is exclusive-or'ed with a secret 64-bit initialization vector <BR>(IV).) This is called Cipher Block Chaining (CBC) mode. The other two <BR>modes are Output Feedback (OFB) and Cipher Feedback (CFB). <BR> <BR>When it comes to padding the data block, there are several options. One <BR>is to simply append zeros. Two suggested by FIPS PUB 81 are, if the data <BR>is binary data, fill up the block with bits that are the opposite of the <BR>last bit of data, or, if the data is ASCII data, fill up the block with <BR>random bytes and put the ASCII character for the number of pad bytes in <BR>the last byte of the block. Another technique is to pad the block with <BR>random bytes and in the last 3 bits store the original number of data bytes. <BR> <BR>The DES algorithm can also be used to calculate checksums up to 64 bits <BR>long (see FIPS PUB 113). If the number of data bits to be checksummed is <BR>not a multiple of 64, the last data block should be padded with zeros. If <BR>the data is ASCII data, the first bit of each byte should be set to 0. <BR>The data is then encrypted in CBC mode with IV = 0. The leftmost n bits <BR>(where 16 <= n <= 64, and n is a multiple of 8) of the final ciphertext <BR>block are an n-bit checksum. <BR> <BR> <BR>-- <BR>※ 来源:·BBS 水木清华站 bbs.net.tsinghua.edu.cn·[FROM: 202.116.65.13] <BR>
<CENTER>
<H1>BBS水木清华站∶精华区</H1></CENTER></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -