我在并行CTR实现(加密)中使用分段整数计数器(字节数组)。计数器需要以与每个处理器正在处理的数据块相对应的大小递增。因此,该数字需要增加一个以上的比特值。换句话说..字节数组充当Big Integer,我需要用整数因子增加字节数组的和值。 我目前正在使用下面显示的方法使用while循环,但我想知道是否有一个有点明智的方法(& | ^ etc),因为使用循环似乎非常浪费..任何想法?
private void Increment(byte[] Counter)
{
int j = Counter.Length;
while (--j >= 0 && ++Counter[j] == 0) { }
}
/// <summary>
/// Increase a byte array by a numerical value
/// </summary>
/// <param name="Counter">Original byte array</param>
/// <param name="Count">Number to increase by</param>
/// <returns>Array with increased value [byte[]]</returns>
private byte[] Increase(byte[] Counter, Int32 Count)
{
byte[] buffer = new byte[Counter.Length];
Buffer.BlockCopy(Counter, 0, buffer, 0, Counter.Length);
for (int i = 0; i < Count; i++)
Increment(buffer);
return buffer;
}
答案 0 :(得分:2)
标准的O(n)多精度加法是这样的(假设[0]是LSB):
static void Add(byte[] dst, byte[] src)
{
int carry = 0;
for (int i = 0; i < dst.Length; ++i)
{
byte odst = dst[i];
byte osrc = i < src.Length ? src[i] : (byte)0;
byte ndst = (byte)(odst + osrc + carry);
dst[i] = ndst;
carry = ndst < odst ? 1 : 0;
}
}
这可以帮助我们想到这是小学 - 算术的术语,实际上就是这样:
129
+ 123
-----
请记住,从左(最低有效数字)开始,您为每个数字执行添加和携带的位置?在这种情况下,每个数字都是数组中的一个字节。
您考虑使用任意精度BigInteger而不是自己动手吗?它实际上是专门为.NET自己的加密内容创建的。
答案 1 :(得分:0)
我使用了Cory Nelsons答案的变体,它使用正确的endian顺序创建数组并返回一个新数组。这比首次发布的方法要快得多..感谢您的帮助。
private byte[] Increase(byte[] Counter, int Count)
{
int carry = 0;
byte[] buffer = new byte[Counter.Length];
int offset = buffer.Length - 1;
byte[] cnt = BitConverter.GetBytes(Count);
byte osrc, odst, ndst;
Buffer.BlockCopy(Counter, 0, buffer, 0, Counter.Length);
for (int i = offset; i > 0; i--)
{
odst = buffer[i];
osrc = offset - i < cnt.Length ? cnt[offset - i] : (byte)0;
ndst = (byte)(odst + osrc + carry);
carry = ndst < odst ? 1 : 0;
buffer[i] = ndst;
}
return buffer;
}