SafeDispatch/MotoTRBO_XNL_Cmd/MTteaEncoder.cs

67 lines
2.1 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace MotoTRBO_XNL_Cmd
{
public class MTteaEncoder
{
public MTteaEncoder()
{
}
private void encipher(uint[] v, uint[] w, uint[] k)
{
uint y = v[0], z = v[1], sum = 0;
uint delta = 0x9E3779B9;
//uint delta = 0x12345678;
uint a = k[0], b = k[1], c = k[2], d = k[3];
uint n = 32;
while (n-- > 0)
{
sum += delta;
y += (z << 4) + a ^ z + sum ^ (z >> 5) + b;
z += (y << 4) + c ^ y + sum ^ (y >> 5) + d;
}
w[0] = y; w[1] = z;
}
public uint[] ConvertTea(byte c0, byte c1, byte c2, byte c3, byte c4, byte c5, byte c6, byte c7)
{
uint[] u_auth_key = { 0x152C7E9D, 0x38BE41C7, 0x71E96CA4, 0x6CAC1AFC };
//uint[] u_auth_key = { 0x11223344, 0x55667788, 0x99AABBCC, 0xDDEEFF00 };
byte[] random_num = { 0x72, 0xA4, 0x1f, 0x8f, 0x63, 0x66, 0x01, 0xaa };
random_num[0] = c0; random_num[1] = c1; random_num[2] = c2; random_num[3] = c3; random_num[4] = c4; random_num[5] = c5; random_num[6] = c6; random_num[7] = c7;
uint[] encrypted_num = new uint[2];
byte[] random_num1 = { random_num[0], random_num[1], random_num[2], random_num[3] };
byte[] random_num2 = { random_num[4], random_num[5], random_num[6], random_num[7] };
uint[] rand_num_uint = { htonl(random_num1), htonl(random_num2) };
encipher(rand_num_uint, encrypted_num, u_auth_key);
encrypted_num[0] = htonl(BitConverter.GetBytes(encrypted_num[0]));
encrypted_num[1] = htonl(BitConverter.GetBytes(encrypted_num[1]));
return encrypted_num;
}
private uint htonl(byte[] ar)
{
uint output;
output = ((uint)ar[3]);
output += ((uint)ar[2] << 8);
output += ((uint)ar[1] << 16);
output += ((uint)ar[0] << 24);
return output;
}
}
}