Des, tripledes and blowfish in Silverlight

Source: Internet
Author: User

/*
Des, tripledes and blowfish in Silverlight
*/
Namespace broccoliproducts
{
Using system;
Using system. Collections. Generic;
# If debug
Using system. diagnostics;
# Endif // # If debug
Using system. LINQ;
Using system. text;
Using system. IO;
Using system. Security. cryptography;
/// <Summary>
/// Declaration of descrytography class
/// </Summary>
Public static class descrytography
{
//////////////////////////////////////// /////////////////////
// Nested classes
/// <Summary>
/// Declaration of block8byte class
/// </Summary>
Internal class block8byte
{
//////////////////////////////////////// /////////////////
// Constants
Public const int byte_length = 8;
//////////////////////////////////////// /////////////////
// Attributes
Internal byte [] m_data = new byte [byte_length];
//////////////////////////////////////// /////////////////
// Operations
Public void reset ()
{
// Reset bytes
Array. Clear (m_data, 0, byte_length );
}
Public void set (block8byte source)
{
// Copy source data to this
This. Set (source. m_data, 0 );
}
Public void set (byte [] buffer, int ioffset)
{
// Set contents by copying Array
Array. Copy (buffer, ioffset, m_data, 0, byte_length );
}
Public void XOR (block8byte A, block8byte B)
{
// Set byte to a ^ B
For (INT ioffset = 0; ioffset <byte_length; ioffset ++)
M_data [ioffset] = convert. tobyte (A. m_data [ioffset] ^ B. m_data [ioffset]);
}
Public void setbit (INT ibyteoffset, int ibitoffset, bool bflag)
{
// Compose mask
Byte mask = convert. tobyte (1 <ibitoffset );
If (m_data [ibyteoffset] & Mask) = mask )! = Bflag)
M_data [ibyteoffset] ^ = mask;
}
Public bool getbit (INT ibyteoffset, int ibitoffset)
{
// Call sibling Function
Return (this. m_data [ibyteoffset]> ibitoffset) & 0x01) = 0x01;
}
Public void shiftleftwrapped (block8byte S, int ibitshift)
{
// This shift is only applied to the first 32 bits, and parity bit is ignored
// Declaration of local variables
Int ibyteoffset = 0;
Bool bbit = false;
// Copy byte and shift regardless
For (ibyteoffset = 0; ibyteoffset <4; ibyteoffset ++)
M_data [ibyteoffset] = convert. tobyte (S. m_data [ibyteoffset] <ibitshift) & 0xff );
// If shifting by 1...
If (ibitshift = 1)
{
// Repair bits on right of byte
For (ibyteoffset = 0; ibyteoffset <3; ibyteoffset ++)
{
// Get repairing bit Offsets
Bbit = S. getbit (ibyteoffset + 1, 7 );
This. setbit (ibyteoffset, 1, bbit );
}
// Wrap around the final bit
This. setbit (3, 1, S. getbit (0, 7 ));
}
Else if (ibitshift = 2)
{
// Repair bits on right of byte
For (ibyteoffset = 0; ibyteoffset <3; ibyteoffset ++)
{
// Get repairing bit Offsets
Bbit = S. getbit (ibyteoffset + 1, 7 );
This. setbit (ibyteoffset, 2, bbit );
Bbit = S. getbit (ibyteoffset + 1, 6 );
This. setbit (ibyteoffset, 1, bbit );
}
// Wrap around the final bit
This. setbit (3, 2, S. getbit (0, 7 ));
This. setbit (3, 1, S. getbit (0, 6 ));
}
# If debug
Else
Debug. Assert (false );
# Endif // # If debug
}
}
/// <Summary>
/// Declaration of key_set class
/// </Summary>
Internal class key_set
{
//////////////////////////////////////// /////////////////
// Constants
Public const int key_count = 17;
//////////////////////////////////////// /////////////////
// Attributes
Internal block8byte [] m_array;
//////////////////////////////////////// /////////////////
// Construction
Internal key_set ()
{
// Create Array
M_array = new block8byte [key_count];
For (INT I1 = 0; I1 <key_count; I1 ++)
M_array [I1] = new block8byte ();
}
//////////////////////////////////////// /////////////////
// Operations
Public block8byte getat (INT iarrayoffset)
{
Return m_array [iarrayoffset];
}
}
/// <Summary>
/// Declaration of working_set class
/// </Summary>
Internal class working_set
{
//////////////////////////////////////// /////////////////
// Attributes
Internal block8byte IP = new block8byte ();
Internal block8byte [] ln = new block8byte [17];
Internal block8byte [] Rn = new block8byte [17];
Internal block8byte rnexpand = new block8byte ();
Internal block8byte xorblock = new block8byte ();
Internal block8byte sboxvalues = new block8byte ();
Internal block8byte F = new block8byte ();
Internal block8byte x = new block8byte ();
Internal block8byte datablockin = new block8byte ();
Internal block8byte datablockout = new block8byte ();
Internal block8byte decryptxorblock = new block8byte ();
//////////////////////////////////////// /////////////////
// Construction
Internal working_set ()
{
// Build the arrays
For (INT I1 = 0; I1 <17; I1 ++)
{
Ln [I1] = new block8byte ();
Rn [I1] = new block8byte ();
}
}
//////////////////////////////////////// /////////////////
// Operations
Internal void scrub ()
{
// Scrub data
IP. Reset ();
For (INT I1 = 0; I1 <17; I1 ++)
{
Ln [I1]. Reset ();
Rn [I1]. Reset ();
}
Rnexpand. Reset ();
Xorblock. Reset ();
Sboxvalues. Reset ();
F. Reset ();
X. Reset ();
Datablockin. Reset ();
Datablockout. Reset ();
Decryptxorblock. Reset ();
}
}
//////////////////////////////////////// /////////////////////
// Constants
Public const int key_byte_length = 8;
Public const int bits_per_byte = 8;
//////////////////////////////////////// /////////////////////
# Region des tables
/* Permuted choice 1 (PCL )*/
Private Static byte [] bytepc1 = {
57, 49, 41, 33, 25, 17, 9,
1, 58, 50, 42, 34, 26, 18,
10, 2, 59, 51, 43, 35, 27,
19, 11, 3, 60, 52, 44, 36,
63, 55, 47, 39, 31, 23, 15,
7, 62, 54, 46, 38, 30, 22,
14, 6, 61, 53, 45, 37, 29,
21, 13, 5, 28, 20, 12, 4,
};
/* Permuted choice 2 (PC2 )*/
Private Static byte [] bytepc2 = {
14, 17, 11, 24, 1, 5,
3, 28, 15, 6, 21, 10,
23, 19, 12, 4, 26, 8,
16, 7, 27, 20, 13, 2,
41, 52, 31, 37, 47, 55,
30, 40, 51, 45, 33, 48,
44, 49, 39, 56, 34, 53,
46, 42, 50, 36, 29, 32,
};
/* Initial permutation (IP )*/
Private Static byte [] byteip = {
58, 50, 42, 34, 26, 18, 10, 2,
60, 52, 44, 36, 28, 20, 12, 4,
62, 54, 46, 38, 30, 22, 14, 6,
64, 56, 48, 40, 32, 24, 16, 8,
57, 49, 41, 33, 25, 17, 9, 1,
59, 51, 43, 35, 27, 19, 11, 3,
61, 53, 45, 37, 29, 21, 13, 5,
63, 55, 47, 39, 31, 23, 15, 7
};
/* Reverse final permutation (IP-1 )*/
Private Static byte [] byterfp = {
40, 8, 48, 16, 56, 24, 64, 32,
39, 7, 47, 15, 55, 23, 63, 31,
38, 6, 46, 14, 54, 22, 62, 30,
37, 5, 45, 13, 53, 21, 61, 29,
36, 4, 44, 12, 52, 20, 60, 28,
35, 3, 43, 11, 51, 19, 59, 27,
34, 2, 42, 10, 50, 18, 58, 26,
33, 1, 41, 9, 49, 17, 57, 25,
};
/* E bit-selection table */
Private Static byte [] bytee = {
32, 1, 2, 3, 4, 5,
4, 5, 6, 7, 8, 9,
8, 9, 10, 11, 12, 13,
12, 13, 14, 15, 16, 17,
16, 17, 18, 19, 20, 21,
20, 21, 22, 23, 24, 25,
24, 25, 26, 27, 28, 29,
28, 29, 30, 31, 32, 1
};
/* Permutation function p */
Private Static byte [] bytep = {
16, 7, 20, 21,
29, 12, 28, 17,
1, 15, 23, 26,
5, 18, 31, 10,
2, 8, 24, 14,
32, 27, 3, 9,
19, 13, 30, 6,
22, 11, 4, 25
};
// Schedule of left shifts for C and D Blocks
Private Static byte [] byteshifts = {1, 1, 2, 2, 2, 2, 2, 1, 2, 2, 2, 1 };
// S-boxes
Private Static byte [,] bytesbox = new byte [,] {
{14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7 },
{0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8 },
{4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0 },
{15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13 },
{15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10 },
{3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5 },
{0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15 },
{13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9 },
{10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8 },
{13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1 },
{13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7 },
{1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12 },
{7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15 },
{13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9 },
{10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4 },
{3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14 },
{2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9 },
{14, 11, 2, 12, 4, 7, 13, 1, 5,

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.