public void Encrypt(BufRef dest, BufLen data, bool zeropad) { if (data == null || data.Length > 222) { throw new InvalidParameterException("ElGamal data length can max be 222 bytes!"); } var hashbuf = new BufRefLen(new byte[255]); hashbuf.Write8(0xFF); hashbuf.Write(I2PHashSHA256.GetHash(data)); hashbuf.Write(data); hashbuf.Reset(); var b = b1.Multiply(new BigInteger(1, hashbuf.ToByteArray())).Mod(I2PConstants.ElGamalP); if (zeropad) { dest.Write8(0); dest.Write(a.ToByteArray(256)); dest.Write8(0); dest.Write(b.ToByteArray(256)); } else { dest.Write(a.ToByteArray(256)); dest.Write(b.ToByteArray(256)); } }
public static byte[] Decode(string data) { if (data.Length < 4 || data.Length % 4 != 0) { throw new FormatException("FreenetBase64 string needs to be padded to 4 byte align!"); } var size = 3 * (data.Length / 4); if (data[data.Length - 1] == '=') { --size; } if (data[data.Length - 2] == '=') { --size; } if (data[data.Length - 3] == '=') { --size; } var result = new byte[size]; if (Codomain == null) { Codomain = new int[256]; for (int i = 0; i < 256; ++i) { Codomain[i] = -1; } for (int i = 0; i < 64; ++i) { Codomain[(byte)Domain[i]] = i; } Codomain[(byte)'='] = 0; } byte v1, v2; var reader = data.GetEnumerator(); reader.MoveNext(); var writer = new BufRefLen(result); for (int i = 0; i < data.Length / 4; ++i) { v1 = Lookup(reader); v2 = Lookup(reader); v1 <<= 2; v1 |= (byte)(v2 >> 4); writer.Write8(v1); if (writer.Length == 0) { break; } v2 <<= 4; v1 = Lookup(reader); v2 |= (byte)(v1 >> 2); writer.Write8(v2); if (writer.Length == 0) { break; } v2 = Lookup(reader); v2 |= (byte)(v1 << 6); writer.Write8(v2); if (writer.Length == 0) { break; } } return(result); }