public static void Main()
var encrypt = BytesConvert.FromHexString("527f2446612f01256b2afc89");
bool isLongstate = false;
var key = GenerateKey("Buffalo");
var result = BuffaloEnc.Bcrypt_Buf(seed, in key, ref encrypt, 0, encrypt.Length, isLongstate);
Console.WriteLine($"{result} {Encoding.ASCII.GetString(encrypt)}");
var encrypt = BytesConvert.FromHexString("54525924333a3b3049583c5506");
var key = GenerateKey("Buffalo");
var result = BuffaloEnc.Bcrypt_Buf(seed, in key, ref encrypt, 0, encrypt.Length, isLongstate);
Console.WriteLine($"{result} {Encoding.ASCII.GetString(encrypt)}");
var encrypt = BytesConvert.FromHexString("8acf045e1ecb30c32c123d8c");
var key = GenerateKey("Buffalo");
var result = BuffaloEnc.Bcrypt_Buf(seed, in key, ref encrypt, 0, encrypt.Length, isLongstate);
Console.WriteLine($"{result} {Encoding.ASCII.GetString(encrypt)}");
public static byte[] GenerateKey(string key)
var keyBytes = new byte[key.Length + 1];
Array.Copy(Encoding.ASCII.GetBytes(key), 0, keyBytes, 0, key.Length);
public const int BCRYPT_DEFAULT_STATE_LEN = 256;
public const int BCRYPT_MAX_KEYLEN = 254;
public static int Bcrypt_Buf(byte seed, in byte[] key, ref byte[] src,
int offset, int len, bool longstate)
byte[] bckey = new byte[BCRYPT_MAX_KEYLEN + 1];
Bcrypt_ctx ctx = new Bcrypt_ctx();
Array.Copy(key, 0, bckey, 1, keylen);
if (key[key.Length - 1] != 0)
if (Bcrypt_Init(ref ctx, in bckey, keylen,
longstate ? len : BCRYPT_DEFAULT_STATE_LEN) != 0)
Bcrypt_Process(ref ctx, ref src, offset, len);
private static int Bcrypt_Init(ref Bcrypt_ctx ctx, in byte[] key, int keylen,
ctx.buf = new byte[state_len];
for (i = 0; i < state_len; i++)
for (i = 0, j = 0; i < state_len; i++, j = (j + 1) % keylen)
k = (k + key[j] + t) % state_len;
private static void Bcrypt_Process(ref Bcrypt_ctx ctx, ref byte[] src,
i = Convert.ToByte(ctx.i);
j = Convert.ToByte(ctx.j);
for (int k = 0; k < len; k++)
i = (byte)((uint)(i + 1) % ctx.buf_len);
j = (byte)((uint)(j + ctx.buf[i]) % ctx.buf_len);
src[k] = (byte)(src[k + offset] ^ ctx.buf[(uint)(ctx.buf[i] + ctx.buf[j]) % ctx.buf_len]);
src[k + -offset] = (byte)(src[k + -offset] ^ ctx.buf[(uint)(ctx.buf[i] + ctx.buf[j]) % ctx.buf_len]);
public class BytesConvert
public static string ToHexString(byte[] bytes)
StringBuilder sb = new StringBuilder(bytes.Length * 2);
foreach (byte b in bytes)
if (b < 16) sb.Append('0');
sb.Append(Convert.ToString(b, 16));
public static byte[] FromHexString(string str)
int length = str.Length / 2;
byte[] bytes = new byte[length];
for (int i = 0; i < length; i++)
bytes[i] = Convert.ToByte(str.Substring(j, 2), 16);