?? serpent_standard.java
字號:
// $Id: $//// $Log: $// Revision 1.1.1 1998/04/10 raif// + added code to generate Intermediate Values KAT.// + cosmetics.//// Revision 1.1 1998/04/07 Serpent authors// + revised slightly (endianness, and key schedule for variable lengths)//// Revision 1.0 1998/04/06 raif// + original version.//// $Endlog$/* * Copyright (c) 1997, 1998 Systemics Ltd on behalf of * the Cryptix Development Team. All rights reserved. */package Serpent;import java.io.PrintWriter;import java.security.InvalidKeyException;//.........................................................................../** * A standard implementation in Java of the Serpent cipher.<p> * * Serpent is a 128-bit 32-round block cipher with variable key lengths, * including 128-, 192- and 256-bit keys conjectured to be at least as * secure as three-key triple-DES.<p> * * Serpent was designed by Ross Anderson, Eli Biham and Lars Knudsen as a * candidate algorithm for the NIST AES Quest.<p> * * References:<ol> * <li>Serpent: A New Block Cipher Proposal. This paper was published in the * proceedings of the "Fast Software Encryption Workshop No. 5" held in * Paris in March 1998. LNCS, Springer Verlag.<p> * <li>Reference implementation of the standard Serpent cipher written in C * by <a href="http://www.cl.cam.ac.uk/~fms/"> Frank Stajano</a>.</ol><p> * * <b>Copyright</b> © 1997, 1998 * <a href="http://www.systemics.com/">Systemics Ltd</a> on behalf of the * <a href="http://www.systemics.com/docs/cryptix/">Cryptix Development Team</a>. * <br>All rights reserved.<p> * * <b>$Revision: $</b> * @author Raif S. Naffah * @author Serpent authors (Ross Anderson, Eli Biham and Lars Knudsen) */public final class Serpent_Standard // implicit no-argument constructor{// Debugging methods and variables//........................................................................... static final String NAME = "Serpent_Standard"; static final boolean IN = true, OUT = false; static final boolean DEBUG = Serpent_Properties.GLOBAL_DEBUG; /** * Depending on the value assigned to debuglevel, the following sensitive * information is displayed: * * 9 all intermediary key computation * 8 final session key values * 7 all block encryption/decryption intermediary values * 6 final block encryption/decryption values before final permutation */ static final int debuglevel = DEBUG ? Serpent_Properties.getLevel("Serpent_Algorithm") : 0; static final PrintWriter err = DEBUG ? Serpent_Properties.getOutput() : null; static final boolean TRACE = Serpent_Properties.isTraceable("Serpent_Algorithm"); static void debug (String s) { err.println(">>> "+NAME+": "+s); } static void trace (boolean in, String s) { if (TRACE) err.println((in?"==> ":"<== ")+NAME+"."+s); } static void trace (String s) { if (TRACE) err.println("<=> "+NAME+"."+s); }// Constants and variables//........................................................................... static final int BLOCK_SIZE = 16; // bytes in a data-block static final int ROUNDS = 32; // nbr of rounds static final int PHI = 0x9E3779B9; // (sqrt(5) - 1) * 2**31 /** * An array of 32 (number of rounds) S boxes.<p> * * An S box is an array of 16 distinct quantities, each in the range 0-15. * A value v at position p for a given S box, implies that if this S box * is given on input a value p, it will return the value v. */ static final byte[][] Sbox = new byte[][] { { 3, 8,15, 1,10, 6, 5,11,14,13, 4, 2, 7, 0, 9,12 },/* S0: */ {15,12, 2, 7, 9, 0, 5,10, 1,11,14, 8, 6,13, 3, 4 },/* S1: */ { 8, 6, 7, 9, 3,12,10,15,13, 1,14, 4, 0,11, 5, 2 },/* S2: */ { 0,15,11, 8,12, 9, 6, 3,13, 1, 2, 4,10, 7, 5,14 },/* S3: */ { 1,15, 8, 3,12, 0,11, 6, 2, 5, 4,10, 9,14, 7,13 },/* S4: */ {15, 5, 2,11, 4,10, 9,12, 0, 3,14, 8,13, 6, 7, 1 },/* S5: */ { 7, 2,12, 5, 8, 4, 6,11,14, 9, 1,15,13, 3,10, 0 },/* S6: */ { 1,13,15, 0,14, 8, 2,11, 7, 4,12,10, 9, 3, 5, 6 },/* S7: */ { 3, 8,15, 1,10, 6, 5,11,14,13, 4, 2, 7, 0, 9,12 },/* S0: */ {15,12, 2, 7, 9, 0, 5,10, 1,11,14, 8, 6,13, 3, 4 },/* S1: */ { 8, 6, 7, 9, 3,12,10,15,13, 1,14, 4, 0,11, 5, 2 },/* S2: */ { 0,15,11, 8,12, 9, 6, 3,13, 1, 2, 4,10, 7, 5,14 },/* S3: */ { 1,15, 8, 3,12, 0,11, 6, 2, 5, 4,10, 9,14, 7,13 },/* S4: */ {15, 5, 2,11, 4,10, 9,12, 0, 3,14, 8,13, 6, 7, 1 },/* S5: */ { 7, 2,12, 5, 8, 4, 6,11,14, 9, 1,15,13, 3,10, 0 },/* S6: */ { 1,13,15, 0,14, 8, 2,11, 7, 4,12,10, 9, 3, 5, 6 },/* S7: */ { 3, 8,15, 1,10, 6, 5,11,14,13, 4, 2, 7, 0, 9,12 },/* S0: */ {15,12, 2, 7, 9, 0, 5,10, 1,11,14, 8, 6,13, 3, 4 },/* S1: */ { 8, 6, 7, 9, 3,12,10,15,13, 1,14, 4, 0,11, 5, 2 },/* S2: */ { 0,15,11, 8,12, 9, 6, 3,13, 1, 2, 4,10, 7, 5,14 },/* S3: */ { 1,15, 8, 3,12, 0,11, 6, 2, 5, 4,10, 9,14, 7,13 },/* S4: */ {15, 5, 2,11, 4,10, 9,12, 0, 3,14, 8,13, 6, 7, 1 },/* S5: */ { 7, 2,12, 5, 8, 4, 6,11,14, 9, 1,15,13, 3,10, 0 },/* S6: */ { 1,13,15, 0,14, 8, 2,11, 7, 4,12,10, 9, 3, 5, 6 },/* S7: */ { 3, 8,15, 1,10, 6, 5,11,14,13, 4, 2, 7, 0, 9,12 },/* S0: */ {15,12, 2, 7, 9, 0, 5,10, 1,11,14, 8, 6,13, 3, 4 },/* S1: */ { 8, 6, 7, 9, 3,12,10,15,13, 1,14, 4, 0,11, 5, 2 },/* S2: */ { 0,15,11, 8,12, 9, 6, 3,13, 1, 2, 4,10, 7, 5,14 },/* S3: */ { 1,15, 8, 3,12, 0,11, 6, 2, 5, 4,10, 9,14, 7,13 },/* S4: */ {15, 5, 2,11, 4,10, 9,12, 0, 3,14, 8,13, 6, 7, 1 },/* S5: */ { 7, 2,12, 5, 8, 4, 6,11,14, 9, 1,15,13, 3,10, 0 },/* S6: */ { 1,13,15, 0,14, 8, 2,11, 7, 4,12,10, 9, 3, 5, 6 } /* S7: */ }; static final byte[][] SboxInverse = new byte[][] { {13, 3,11, 0,10, 6, 5,12, 1,14, 4, 7,15, 9, 8, 2 },/* InvS0: */ { 5, 8, 2,14,15, 6,12, 3,11, 4, 7, 9, 1,13,10, 0 },/* InvS1: */ {12, 9,15, 4,11,14, 1, 2, 0, 3, 6,13, 5, 8,10, 7 },/* InvS2: */ { 0, 9,10, 7,11,14, 6,13, 3, 5,12, 2, 4, 8,15, 1 },/* InvS3: */ { 5, 0, 8, 3,10, 9, 7,14, 2,12,11, 6, 4,15,13, 1 },/* InvS4: */ { 8,15, 2, 9, 4, 1,13,14,11, 6, 5, 3, 7,12,10, 0 },/* InvS5: */ {15,10, 1,13, 5, 3, 6, 0, 4, 9,14, 7, 2,12, 8,11 },/* InvS6: */ { 3, 0, 6,13, 9,14,15, 8, 5,12,11, 7,10, 1, 4, 2 },/* InvS7: */ {13, 3,11, 0,10, 6, 5,12, 1,14, 4, 7,15, 9, 8, 2 },/* InvS0: */ { 5, 8, 2,14,15, 6,12, 3,11, 4, 7, 9, 1,13,10, 0 },/* InvS1: */ {12, 9,15, 4,11,14, 1, 2, 0, 3, 6,13, 5, 8,10, 7 },/* InvS2: */ { 0, 9,10, 7,11,14, 6,13, 3, 5,12, 2, 4, 8,15, 1 },/* InvS3: */ { 5, 0, 8, 3,10, 9, 7,14, 2,12,11, 6, 4,15,13, 1 },/* InvS4: */ { 8,15, 2, 9, 4, 1,13,14,11, 6, 5, 3, 7,12,10, 0 },/* InvS5: */ {15,10, 1,13, 5, 3, 6, 0, 4, 9,14, 7, 2,12, 8,11 },/* InvS6: */ { 3, 0, 6,13, 9,14,15, 8, 5,12,11, 7,10, 1, 4, 2 },/* InvS7: */ {13, 3,11, 0,10, 6, 5,12, 1,14, 4, 7,15, 9, 8, 2 },/* InvS0: */ { 5, 8, 2,14,15, 6,12, 3,11, 4, 7, 9, 1,13,10, 0 },/* InvS1: */ {12, 9,15, 4,11,14, 1, 2, 0, 3, 6,13, 5, 8,10, 7 },/* InvS2: */ { 0, 9,10, 7,11,14, 6,13, 3, 5,12, 2, 4, 8,15, 1 },/* InvS3: */ { 5, 0, 8, 3,10, 9, 7,14, 2,12,11, 6, 4,15,13, 1 },/* InvS4: */ { 8,15, 2, 9, 4, 1,13,14,11, 6, 5, 3, 7,12,10, 0 },/* InvS5: */ {15,10, 1,13, 5, 3, 6, 0, 4, 9,14, 7, 2,12, 8,11 },/* InvS6: */ { 3, 0, 6,13, 9,14,15, 8, 5,12,11, 7,10, 1, 4, 2 },/* InvS7: */ {13, 3,11, 0,10, 6, 5,12, 1,14, 4, 7,15, 9, 8, 2 },/* InvS0: */ { 5, 8, 2,14,15, 6,12, 3,11, 4, 7, 9, 1,13,10, 0 },/* InvS1: */ {12, 9,15, 4,11,14, 1, 2, 0, 3, 6,13, 5, 8,10, 7 },/* InvS2: */ { 0, 9,10, 7,11,14, 6,13, 3, 5,12, 2, 4, 8,15, 1 },/* InvS3: */ { 5, 0, 8, 3,10, 9, 7,14, 2,12,11, 6, 4,15,13, 1 },/* InvS4: */ { 8,15, 2, 9, 4, 1,13,14,11, 6, 5, 3, 7,12,10, 0 },/* InvS5: */ {15,10, 1,13, 5, 3, 6, 0, 4, 9,14, 7, 2,12, 8,11 },/* InvS6: */ { 3, 0, 6,13, 9,14,15, 8, 5,12,11, 7,10, 1, 4, 2 } /* InvS7: */ }; static final byte[] IPtable = new byte[] { 0, 32, 64, 96, 1, 33, 65, 97, 2, 34, 66, 98, 3, 35, 67, 99, 4, 36, 68, 100, 5, 37, 69, 101, 6, 38, 70, 102, 7, 39, 71, 103, 8, 40, 72, 104, 9, 41, 73, 105, 10, 42, 74, 106, 11, 43, 75, 107, 12, 44, 76, 108, 13, 45, 77, 109, 14, 46, 78, 110, 15, 47, 79, 111, 16, 48, 80, 112, 17, 49, 81, 113, 18, 50, 82, 114, 19, 51, 83, 115, 20, 52, 84, 116, 21, 53, 85, 117, 22, 54, 86, 118, 23, 55, 87, 119, 24, 56, 88, 120, 25, 57, 89, 121, 26, 58, 90, 122, 27, 59, 91, 123, 28, 60, 92, 124, 29, 61, 93, 125, 30, 62, 94, 126, 31, 63, 95, 127 }; static final byte[] FPtable = new byte[] { 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64, 68, 72, 76, 80, 84, 88, 92, 96, 100, 104, 108, 112, 116, 120, 124, 1, 5, 9, 13, 17, 21, 25, 29, 33, 37, 41, 45, 49, 53, 57, 61, 65, 69, 73, 77, 81, 85, 89, 93, 97, 101, 105, 109, 113, 117, 121, 125, 2, 6, 10, 14, 18, 22, 26, 30, 34, 38, 42, 46, 50, 54, 58, 62, 66, 70, 74, 78, 82, 86, 90, 94, 98, 102, 106, 110, 114, 118, 122, 126, 3, 7, 11, 15, 19, 23, 27, 31, 35, 39, 43, 47, 51, 55, 59, 63, 67, 71, 75, 79, 83, 87, 91, 95, 99, 103, 107, 111, 115, 119, 123, 127 }; static final byte xFF = (byte) 0xFF; /** * The Linear Transformation is represented as an array of 128 rows, * one for each output bit. Each one of the 128 rows, terminated by a * marker (xFF) which isn't part of the data, is composed of up to 7 * quantities in the range 0-127 specifying the positions of the input * bits that must be XORed together (say, 72, 144 and 125) to yield the * output bit corresponding to the position of that list (say, 1). */ static final byte[][] LTtable = new byte[][] { {16, 52, 56, 70, 83, 94, 105, xFF}, {72, 114, 125, xFF, xFF, xFF, xFF, xFF}, { 2, 9, 15, 30, 76, 84, 126, xFF}, {36, 90, 103, xFF, xFF, xFF, xFF, xFF}, {20, 56, 60, 74, 87, 98, 109, xFF}, { 1, 76, 118, xFF, xFF, xFF, xFF, xFF}, { 2, 6, 13, 19, 34, 80, 88, xFF}, {40, 94, 107, xFF, xFF, xFF, xFF, xFF}, {24, 60, 64, 78, 91, 102, 113, xFF}, { 5, 80, 122, xFF, xFF, xFF, xFF, xFF}, { 6, 10, 17, 23, 38, 84, 92, xFF}, {44, 98, 111, xFF, xFF, xFF, xFF, xFF}, {28, 64, 68, 82, 95, 106, 117, xFF}, { 9, 84, 126, xFF, xFF, xFF, xFF, xFF}, {10, 14, 21, 27, 42, 88, 96, xFF}, {48, 102, 115, xFF, xFF, xFF, xFF, xFF}, {32, 68, 72, 86, 99, 110, 121, xFF}, { 2, 13, 88, xFF, xFF, xFF, xFF, xFF}, {14, 18, 25, 31, 46, 92, 100, xFF}, {52, 106, 119, xFF, xFF, xFF, xFF, xFF}, {36, 72, 76, 90, 103, 114, 125, xFF}, { 6, 17, 92, xFF, xFF, xFF, xFF, xFF}, {18, 22, 29, 35, 50, 96, 104, xFF}, {56, 110, 123, xFF, xFF, xFF, xFF, xFF}, { 1, 40, 76, 80, 94, 107, 118, xFF}, {10, 21, 96, xFF, xFF, xFF, xFF, xFF}, {22, 26, 33, 39, 54, 100, 108, xFF}, {60, 114, 127, xFF, xFF, xFF, xFF, xFF}, { 5, 44, 80, 84, 98, 111, 122, xFF}, {14, 25, 100, xFF, xFF, xFF, xFF, xFF}, {26, 30, 37, 43, 58, 104, 112, xFF}, { 3, 118, xFF, xFF, xFF, xFF, xFF, xFF}, { 9, 48, 84, 88, 102, 115, 126, xFF}, {18, 29, 104, xFF, xFF, xFF, xFF, xFF}, {30, 34, 41, 47, 62, 108, 116, xFF}, { 7, 122, xFF, xFF, xFF, xFF, xFF, xFF}, { 2, 13, 52, 88, 92, 106, 119, xFF}, {22, 33, 108, xFF, xFF, xFF, xFF, xFF}, {34, 38, 45, 51, 66, 112, 120, xFF}, {11, 126, xFF, xFF, xFF, xFF, xFF, xFF}, { 6, 17, 56, 92, 96, 110, 123, xFF}, {26, 37, 112, xFF, xFF, xFF, xFF, xFF}, {38, 42, 49, 55, 70, 116, 124, xFF}, { 2, 15, 76, xFF, xFF, xFF, xFF, xFF}, {10, 21, 60, 96, 100, 114, 127, xFF}, {30, 41, 116, xFF, xFF, xFF, xFF, xFF}, { 0, 42, 46, 53, 59, 74, 120, xFF}, { 6, 19, 80, xFF, xFF, xFF, xFF, xFF}, { 3, 14, 25, 100, 104, 118, xFF, xFF}, {34, 45, 120, xFF, xFF, xFF, xFF, xFF}, { 4, 46, 50, 57, 63, 78, 124, xFF}, {10, 23, 84, xFF, xFF, xFF, xFF, xFF}, { 7, 18, 29, 104, 108, 122, xFF, xFF}, {38, 49, 124, xFF, xFF, xFF, xFF, xFF}, { 0, 8, 50, 54, 61, 67, 82, xFF}, {14, 27, 88, xFF, xFF, xFF, xFF, xFF}, {11, 22, 33, 108, 112, 126, xFF, xFF}, { 0, 42, 53, xFF, xFF, xFF, xFF, xFF}, { 4, 12, 54, 58, 65, 71, 86, xFF}, {18, 31, 92, xFF, xFF, xFF, xFF, xFF}, { 2, 15, 26, 37, 76, 112, 116, xFF}, { 4, 46, 57, xFF, xFF, xFF, xFF, xFF}, { 8, 16, 58, 62, 69, 75, 90, xFF}, {22, 35, 96, xFF, xFF, xFF, xFF, xFF}, { 6, 19, 30, 41, 80, 116, 120, xFF}, { 8, 50, 61, xFF, xFF, xFF, xFF, xFF}, {12, 20, 62, 66, 73, 79, 94, xFF}, {26, 39, 100, xFF, xFF, xFF, xFF, xFF}, {10, 23, 34, 45, 84, 120, 124, xFF}, {12, 54, 65, xFF, xFF, xFF, xFF, xFF}, {16, 24, 66, 70, 77, 83, 98, xFF}, {30, 43, 104, xFF, xFF, xFF, xFF, xFF}, { 0, 14, 27, 38, 49, 88, 124, xFF}, {16, 58, 69, xFF, xFF, xFF, xFF, xFF}, {20, 28, 70, 74, 81, 87, 102, xFF}, {34, 47, 108, xFF, xFF, xFF, xFF, xFF}, { 0, 4, 18, 31, 42, 53, 92, xFF}, {20, 62, 73, xFF, xFF, xFF, xFF, xFF}, {24, 32, 74, 78, 85, 91, 106, xFF}, {38, 51, 112, xFF, xFF, xFF, xFF, xFF}, { 4, 8, 22, 35, 46, 57, 96, xFF}, {24, 66, 77, xFF, xFF, xFF, xFF, xFF}, {28, 36, 78, 82, 89, 95, 110, xFF}, {42, 55, 116, xFF, xFF, xFF, xFF, xFF}, { 8, 12, 26, 39, 50, 61, 100, xFF}, {28, 70, 81, xFF, xFF, xFF, xFF, xFF}, {32, 40, 82, 86, 93, 99, 114, xFF}, {46, 59, 120, xFF, xFF, xFF, xFF, xFF}, {12, 16, 30, 43, 54, 65, 104, xFF}, {32, 74, 85, xFF, xFF, xFF, xFF, xFF}, {36, 90, 103, 118, xFF, xFF, xFF, xFF}, {50, 63, 124, xFF, xFF, xFF, xFF, xFF}, {16, 20, 34, 47, 58, 69, 108, xFF}, {36, 78, 89, xFF, xFF, xFF, xFF, xFF}, {40, 94, 107, 122, xFF, xFF, xFF, xFF}, { 0, 54, 67, xFF, xFF, xFF, xFF, xFF}, {20, 24, 38, 51, 62, 73, 112, xFF}, {40, 82, 93, xFF, xFF, xFF, xFF, xFF}, {44, 98, 111, 126, xFF, xFF, xFF, xFF}, { 4, 58, 71, xFF, xFF, xFF, xFF, xFF}, {24, 28, 42, 55, 66, 77, 116, xFF}, {44, 86, 97, xFF, xFF, xFF, xFF, xFF}, { 2, 48, 102, 115, xFF, xFF, xFF, xFF}, { 8, 62, 75, xFF, xFF, xFF, xFF, xFF}, {28, 32, 46, 59, 70, 81, 120, xFF}, {48, 90, 101, xFF, xFF, xFF, xFF, xFF}, { 6, 52, 106, 119, xFF, xFF, xFF, xFF}, {12, 66, 79, xFF, xFF, xFF, xFF, xFF}, {32, 36, 50, 63, 74, 85, 124, xFF}, {52, 94, 105, xFF, xFF, xFF, xFF, xFF}, {10, 56, 110, 123, xFF, xFF, xFF, xFF}, {16, 70, 83, xFF, xFF, xFF, xFF, xFF}, { 0, 36, 40, 54, 67, 78, 89, xFF}, {56, 98, 109, xFF, xFF, xFF, xFF, xFF}, {14, 60, 114, 127, xFF, xFF, xFF, xFF}, {20, 74, 87, xFF, xFF, xFF, xFF, xFF}, { 4, 40, 44, 58, 71, 82, 93, xFF}, {60, 102, 113, xFF, xFF, xFF, xFF, xFF}, { 3, 18, 72, 114, 118, 125, xFF, xFF}, {24, 78, 91, xFF, xFF, xFF, xFF, xFF}, { 8, 44, 48, 62, 75, 86, 97, xFF}, {64, 106, 117, xFF, xFF, xFF, xFF, xFF}, { 1, 7, 22, 76, 118, 122, xFF, xFF}, {28, 82, 95, xFF, xFF, xFF, xFF, xFF}, {12, 48, 52, 66, 79, 90, 101, xFF}, {68, 110, 121, xFF, xFF, xFF, xFF, xFF}, { 5, 11, 26, 80, 122, 126, xFF, xFF}, {32, 86, 99, xFF, xFF, xFF, xFF, xFF} }; static final byte[][] LTtableInverse = new byte[][] { { 53, 55, 72, xFF, xFF, xFF, xFF, xFF},
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -