public byte[] Decrypt(byte[] startupInput, byte[] keyInput, int w, int r, int b) { var key = GetKey(keyInput, b); for (int i = 0; i < keyInput.Length; i++) { keyInput[i] = 0; } var helper = new RC5Helper(w, r, key); var input = GetEncryptingResultModel(startupInput, helper.BlockSize); var result = new byte[input.EncryptedData.Length]; var IV = DecryptInitializeVector(input.IV, key, w, r); for (int i = 0; i < input.EncryptedData.Length; i += helper.BlockSize) { var currentBlock = new byte[helper.BlockSize]; Array.Copy(input.EncryptedData, i, currentBlock, 0, helper.BlockSize); var decryptedBlock = DecryptBlock(currentBlock, helper); decryptedBlock = XOR(IV, decryptedBlock, helper.W); Array.Copy(decryptedBlock, 0, result, i, helper.BlockSize); IV = currentBlock; } return(RemoveAppending(result)); }
public EncryptingResultModel Encrypt(byte[] input, byte[] keyInput, int w, int r, int b) { var key = GetKey(keyInput, b); for (int i = 0; i < keyInput.Length; i++) { keyInput[i] = 0; } var helper = new RC5Helper(w, r, key); input = GetFullInput(input, helper.BlockSize); var IV = GetInitializeVector(helper.BlockSize); var resultData = new byte[input.Length]; var result = new EncryptingResultModel { IV = EncryptInitializeVector(IV, key, w, r) }; for (int i = 0; i < input.Length; i += helper.BlockSize) { var currentBlock = new byte[helper.BlockSize]; Array.Copy(input, i, currentBlock, 0, helper.BlockSize); currentBlock = XOR(IV, currentBlock, helper.W); IV = EncryptBlock(currentBlock, helper); Array.Copy(IV, 0, resultData, i, helper.BlockSize); } result.EncryptedData = resultData; return(result); }
private byte[] DecryptInitializeVector(byte[] input, byte[] key, int w, int r) { var helper = new RC5Helper(w, r, key); var result = new byte[input.Length]; for (int i = 0; i < input.Length; i += helper.BlockSize) { var currentBlock = new byte[helper.BlockSize]; Array.Copy(input, i, currentBlock, 0, helper.BlockSize); currentBlock = DecryptBlock(currentBlock, helper); Array.Copy(currentBlock, 0, result, i, helper.BlockSize); } return(result); }
private byte[] EncryptBlock(byte[] block, RC5Helper helper) { var A = GetBlockPart(block, true, helper.W); var B = GetBlockPart(block, false, helper.W); A += helper.S[0]; B += helper.S[1]; for (int i = 1; i <= helper.R; i++) { A = helper.RotateLeft((A ^ B), (int)B, helper.W * 8) + helper.S[2 * i]; B = helper.RotateLeft((B ^ A), (int)A, helper.W * 8) + helper.S[2 * i + 1]; } var result = new byte[2 * helper.W]; var partA = BitConverter.GetBytes(A); var partB = BitConverter.GetBytes(B); Array.Copy(partA, 0, result, 0, helper.W); Array.Copy(partB, 0, result, helper.W, helper.W); return(result); }
private byte[] DecryptBlock(byte[] block, RC5Helper helper) { var A = GetBlockPart(block, true, helper.W); var B = GetBlockPart(block, false, helper.W); for (int i = helper.R; i > 0; i--) { B = helper.RotateRight(B - helper.S[2 * i + 1], (int)A, helper.W * 8) ^ A; A = helper.RotateRight(A - helper.S[2 * i], (int)B, helper.W * 8) ^ B; } A -= helper.S[0]; B -= helper.S[1]; var result = new byte[2 * helper.W]; var partA = BitConverter.GetBytes(A); var partB = BitConverter.GetBytes(B); Array.Copy(partA, 0, result, 0, helper.W); Array.Copy(partB, 0, result, helper.W, helper.W); return(result); }