я могу получить ProcessBytes для возврата точной суммы? - PullRequest
2 голосов
/ 16 июля 2011

Я использую BouncyCastel для создания CfbBlockCipher, поэтому вот коды.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Modes;
using Org.BouncyCastle.Crypto.Engines;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Math;


namespace Common.Encryption
{
    public class BlowfishCryptographer
    {
        private bool forEncryption;
        private IBufferedCipher cipher;

        public BlowfishCryptographer(bool forEncryption)
        {
            this.forEncryption = forEncryption;
            cipher = new BufferedBlockCipher(new CfbBlockCipher(new BlowfishEngine(), 64));
            cipher.Init(forEncryption, new ParametersWithIV(new KeyParameter(Encoding.ASCII.GetBytes("DR654dt34trg4UI6")), new byte[8]));
        }
        public void ReInit(byte[] IV,BigInteger pubkey)
        {
            cipher.Init(forEncryption, new ParametersWithIV(new KeyParameter(pubkey.ToByteArrayUnsigned()),IV));
        }
        public byte[] DoFinal()
        {
            return cipher.DoFinal();
        }
        public byte[] DoFinal(byte[] buffer)
        {
           return cipher.DoFinal(buffer);
        }
        public byte[] DoFinal(byte[] buffer, int startIndex, int len)
        {
            return cipher.DoFinal(buffer, startIndex, len);
        }
        public byte[] ProcessBytes(byte[] buffer)
        {
            return cipher.ProcessBytes(buffer);
        }
        public byte[] ProcessBytes(byte[] buffer, int startIndex, int len)
        {
            return cipher.ProcessBytes(buffer, startIndex, len);
        }
        public void   Reset()
        {
            cipher.Reset();
        }
    }
}

так ...

byte[] buf  = new byte[] { 0x83, 0x00, 0xEE, 0x03, 0x26, 0x6D, 0x14, 0x00, 0xF1, 0x65, 0x27, 0x00, 0x19, 0x02, 0xD8, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDB, 0xD7, 0x0F, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };

если я said ProcessBytes(buf, 0, 17), он вернет только 16, ятакже пробовал DoFinal (), но он не делает свою работу !!!это до IBufferedCipher я должен использовать IStreamCipher или что-то еще, чтобы получить точное количество того, что я делаю / кодирую?И я верю, что CfbBlockCipher как-то сломан или я здесь что-то делаю.

1 Ответ

0 голосов
/ 01 августа 2011

Я не знаю, что вы думаете, не делая работу здесь.Вам нужно вызывать ProcessBytes несколько раз и заканчивать с помощью DoFinal ().Обычно ProcessBytes () возвращает только 16 байтов, потому что это в x раз больше размера блока.Шифр не знает, закончили ли вы его байты, поэтому он не может вычислить другой блок, пока вы не вызовете DoFinal ().Конечно, вам нужно добавить выходные данные вызовов ProcessBytes () и DoFinal (), чтобы получить конечный результат ...

...