Пример #1
0
        public static ICryptoTransform GetDecryptor(byte SymAlgo, byte[] IV, byte[] SessionKey)
        {
            if (!IsValidAlgoCode(SymAlgo))
            {
                throw new NotImplementedException("Algorithm not implemented");
            }


            int KeySize       = SymmetricAlgorithmTypes.GetKeySize(SymAlgo);
            int BlockSizeBits = SymmetricAlgorithmTypes.GetBlockSize(SymAlgo);

            if (IV == null)
            {
                IV = new byte[BlockSizeBits / 8]; // Set to all zeros by default
            }
            RijndaelManaged aes = new RijndaelManaged
            {
                KeySize      = KeySize,
                BlockSize    = BlockSizeBits,
                FeedbackSize = BlockSizeBits,
                Key          = SessionKey,
                IV           = IV,
                Mode         = CipherMode.CFB,
                Padding      = PaddingMode.None
            };

            return(aes.CreateDecryptor());
        }
Пример #2
0
        public byte[] GetKey(string Password)
        {
            int           KeySize      = SymmetricAlgorithmTypes.GetKeySize(SymAlgo);
            int           DesiredBytes = (byte)(KeySize / 8);
            HashAlgorithm HashAlgo     = HashAlgorithmTypes.GetHashAlgoManaged(HashAlgorithm);

            byte[] Key = GetSaltedIterated(HashAlgo, DesiredBytes, Salt, Encoding.ASCII.GetBytes(Password), ByteCount);
            return(Key);
        }
Пример #3
0
        public override void Parse(TreeBuilder tree)
        {
            base.Parse(tree);

            bool IsEncrypted = true;

            tree.SetBookMark();
            var S2K = new S2K
            {
                S2KUsage = tree.ReadByte()
            };

            if (S2K.S2KUsage == 254 || S2K.S2KUsage == 255)
            {
                S2K.SymAlgo = tree.ReadByte("Symmetric Algorithm", SymmetricAlgorithmTypes.Get);

                byte S2KSpecifier = tree.ReadByte("S2K Specifier", S2KTypes.Get);

                if (S2KSpecifier != S2KTypes.Salted && S2KSpecifier != S2KTypes.Simple && S2KSpecifier != S2KTypes.IteratedAndSalted)
                {
                    //tree.AddCalculated("Invalid S2K", S2KSpecifier.ToString());
                    tree.AddCalculated("Unable to Process", S2KSpecifier.ToString(), ByteBlockType.CalculatedError);
                    return;
                }

                S2K.HashAlgorithm = tree.ReadByte("Hash Algorithm", HashAlgorithmTypes.Get);

                if (S2KSpecifier == S2KTypes.Salted || S2KSpecifier == S2KTypes.IteratedAndSalted)
                {
                    S2K.Salt = tree.ReadBytes("Salt", 8);
                    if (S2KSpecifier == S2KTypes.IteratedAndSalted)
                    {
                        byte CodedCount = tree.ReadByte("Coded Iteration");
                        S2K.ByteCount = (16 + (CodedCount & 15)) << ((CodedCount >> 4) + 6);
                    }
                }

                int BlockSizeBytes = SymmetricAlgorithmTypes.GetBlockSize(S2K.SymAlgo) / 8;
                S2K.IV = tree.ReadBytes("IV", BlockSizeBytes);
            }
            else
            {
                byte SymAlgo = S2K.S2KUsage;
                S2K.SymAlgo = SymAlgo;

                if (SymAlgo != 0)
                {
                    tree.GoToBookMark();
                    tree.ReadByte("Symmetric Algorithm", SymmetricAlgorithmTypes.Get);
                    int BlockSize = SymmetricAlgorithmTypes.GetBlockSize(SymAlgo) / 8;
                    S2K.IV = tree.ReadBytes("IV", BlockSize);
                }
                else
                {
                    IsEncrypted = false;
                }
            }

            PublicKeyAlgorithm.S2K = S2K;

            if (IsEncrypted)
            {
                byte[] Encrypted = tree.ReadBytes("Encrypted Secret Key");
                PublicKeyAlgorithm.EncryptedPrivateKey = Encrypted;
                tree.CurrentBlock.ProcessBlock        += ExtractPrivateKey;
                SecretKeyNode = tree.CurrentBlock;
            }
            else
            {
                byte[] ClearBytes = tree.ReadBytes("Unencrypted Secret Key");

                var SecBlockClear = PublicKeyAlgorithm.SetPrivate(ClearBytes);
                tree.AddChild(PublicKeyAlgorithm.GetPrivateByteBlocks());
            }
        }