public static byte[] Decrypt(byte[] data, C25519Key key) { var size = data[1] & 127; var sizeLength = 0; var hasFieldSize = (data[1] & 128) != 0; if (hasFieldSize) { sizeLength = size; size = (int)new BigInteger(data.Skip(2).Take(sizeLength).ToArray(), true, true); } var step = 2 + sizeLength; var asymmetricCipher = data.Skip(step).Take(32 * 3).ToArray(); var asymmetricPlain = key.Decrypt(asymmetricCipher); step += AsymmetricSize; if (size == 200) { return(UnPad32(asymmetricPlain)); } var symmetricKey = AesSherableKey.Parse(asymmetricPlain); return(symmetricKey.Decrypt(data.Skip(step).ToArray())); }
public static byte[] Encrypt(byte[] buffer, ulong tag, C25519Key key) { var toAsymmetricEncrypt = Pad32(buffer); var bufferSymmetric = new byte[0]; if (buffer.Length > 32) { var secret = new AesSherableKey(); bufferSymmetric = secret.Encrypt(buffer); toAsymmetricEncrypt = secret.ToByteArray(); } var bufferAsymmetric = key.Encrypt(toAsymmetricEncrypt).ToByteArray(); var tagBuffer = BitConverter.GetBytes(tag); var signature = key.Sign(bufferAsymmetric.Concat(tagBuffer).ToArray()).PadLeft(32 * 3); var size = bufferAsymmetric.Length + tagBuffer.Length + signature.Length + bufferSymmetric.Length; var dimension = DimensionBuffer(size); var all = new byte[1 + dimension.Length + size]; all[0] = 1; // version # dimension.CopyTo(all, 1); var step = dimension.Length + 1; bufferAsymmetric.CopyTo(all, step); step += bufferAsymmetric.Length; tagBuffer.CopyTo(all, step); step += tagBuffer.Length; signature.CopyTo(all, step); step += signature.Length; bufferSymmetric.CopyTo(all, step); return(all); }
public AesSherableKey GenKey(AesKey key) => AesSherableKey.Parse(key.Hash(ToByteArray()));