Пример #1
0
        private byte[] Process(byte[] inputData, ShamirKey key, bool isEncrypt, bool isFirstTime = true)
        {
            if (inputData == null)
            {
                throw new ArgumentNullException("Пустые входные данные");
            }
            if (inputData.Length == 0)
            {
                throw new ArgumentNullException("Пустые входные данные");
            }
            List <byte> result = new List <byte>(inputData.Length);

            BigInteger exponent = isEncrypt ? key.C : key.D;
            BigInteger modulus  = key.Parameters.P;

            int readSize  = 0;
            int writeSize = 0;

            if (isEncrypt)
            {
                readSize  = key.MaxOpenTextSize;
                writeSize = key.MaxCipherTextSize;
            }
            else
            {
                readSize  = key.MaxCipherTextSize;
                writeSize = key.MaxOpenTextSize;
            }

            try
            {
                for (int currentByte = 0; currentByte < inputData.Length; currentByte += readSize)
                {
                    int byteCopyCount = Math.Min(readSize, inputData.Length - currentByte);


                    byte[] currentBlock = new byte[byteCopyCount + 1];   // Добавлен 0х00 чтобы число было положительным

                    Buffer.BlockCopy(inputData, currentByte, currentBlock, 0, byteCopyCount);


                    BigInteger beforeProccesInt = new BigInteger(currentBlock);
                    BigInteger afterProccesInt  = BigInteger.ModPow(beforeProccesInt, exponent, modulus);

                    byte[] cipherBlock = afterProccesInt.ToByteArray(false);

                    byte[] packedBlock = new byte[writeSize];
                    Buffer.BlockCopy(cipherBlock, 0, packedBlock, 0, cipherBlock.Length);

                    result.AddRange(packedBlock);
                }
            }
            catch (Exception ex)
            {
                throw new Exception("Ошибка! Проверьте входные параметры.", ex);
            }

            return(result.ToArray());
        }
Пример #2
0
 public byte[] Encrypt(byte[] text, ShamirKey key, bool isFirstTime)
 {
     return(Process(text, key, true, isFirstTime));
 }
Пример #3
0
 public byte[] Decrypt(byte[] ciphertext, ShamirKey key, bool isFirstTime)
 {
     return(Process(ciphertext, key, false, isFirstTime));
 }