int getPeriod();
int getSeedLength();
}
伪随机数流生成器:
private int read(byte[]buffer,int offset,int num,int bytesRead)
//递归算法
{
if(count + num < maxCount)
{
Random.read(buffer,offset,num);
count + = num;
}
else
{//maxCount- count-1使上面的if语句成立,且使count 一直为零直到最后一次递归
int firstRead = maxCount-count -1;
bytesRead = read(buffer,offset,firstRead ,bytesRead);
RefreshSeed()
count= 0;
return read (buffer,offset+firstRead.num-firstRead ,bytesRead );
}
return num +bytesRead ;
}
加扰器:
public int read(byte[] b, int offset, int length)
{
checkPositive(length, "BinaryXorInterferer.skip:length<0");
checkClosed();
int numHaveRead = m_stream.read(b, offset, length);
byte[] temp = new byte[numHaveRead];
//产生伪随机数的位数由读到的数据流位数决定
m_interfere.read(temp);
for (int i = 0, j = offset; i < numHaveRead; i++, j++)
b[j] ^= temp[i];//按位异或
return numHaveRead;
}
5.2 控制字层
主要问题:随机数流控制字如何生成和传输?
解决方法:上层需要新的控制字的时候,服务器生成一个然后立即发送。因为无法保证控制字会比几乎同时用的这个控制字加密发送的数据更早到达,所以缓冲一个控制字来解决这个问题。
具体细节:
1. 第一层服务器端仅在需要用到的控制生成序列的时候才调用getSeed函数,这点要求了服务器不用再次“缓存”一个Seed。这是以下协议正确性和可靠性所要求的基本保证。
2. 客户端对象必须首先监听,然后服务器对象在创建时立即发送首个控制字,如此,双方在视频尚未建立的时候拥有首个控制字。
3. 以后,服务器端每次被索取控制字时都产生时都产生下一个控制字并发送给,而返回给索取方的上次产生的控制字。
4. 客户端收到控制字时,首先锁住接收端对象,然后检查接收端对象中的buffer是否为空,若为空(正常情况),则放入新的控制字,否则出错。当新控制字放入后,检查旧控制字是否已经被取出,若已经被取出,则重新将新控制字代替旧控制字。
5. 客户端受到上层的索取消息时,首先锁住对象,然后检查是否“旧控制字”位是否有内容,如果没有,出错;如果有(正常情况),取出旧控制字,然后检查新控制字是否已经到达,若到达,将新控制字替换旧控制字。 C#视频DES和RSA双重加密解密算法软件模块的设计实现(11):http://www.youerw.com/jisuanji/lunwen_2849.html