3,881
社区成员
发帖
与我相关
我的任务
分享
/**
* byte = unsigned char
*/
uint64 run_parallel(byte* in, uint64 length) {
int k = 0; //计数器
int s = 1 << 20; // 单核处理缓存
int c = 8; //CPU核心数量
int round = (length >> 20>> 3) << 3;
int done = (round << 20;
#pragma omp parallel for firstprivate(s, c, k)
for (int i = 0; i < round; i++) {
int p = k++ * c + omp_get_thread_num();
EncipherBuffer::run(in + (p * s), s);
}
if (done == length)return length;
return EncipherBuffer::run(in + done, length - done) + done;
}
/**
*方法 handle->update() 返回一个固定密匙
*/
virtual uint64 run(byte* in, uint64 length) {
uint64 round = (length >> L) >> 3;
uint64 remainder = (length >> L) & 7;
for (uint64 i = 0; i < round; i++) {
algorithm->run(in, handler->update());
in += N;
algorithm->run(in, handler->update());
in += N;
algorithm->run(in, handler->update());
in += N;
algorithm->run(in, handler->update());
in += N;
algorithm->run(in, handler->update());
in += N;
algorithm->run(in, handler->update());
in += N;
algorithm->run(in, handler->update());
in += N;
algorithm->run(in, handler->update());
in += N;
}
for (uint64 i = 0; i < remainder; i++) {
algorithm->run(in, handler->update());
in += N;
}
return length;
}
/*
* S为置换盒子,由0~255不重复随机数组成
*/
inline void run(byte M[], byte* K[]) override {
int x = 0, v = R - 1, h = H - 1, X = H;
for (int i = 1; i <= R; i++) {
byte* U = K[i - 1];
byte* V = K[v--];
for (int y = H; y < N;) {
M[y] = unit::S[(M[y] ^ U[y])] ^ M[x];
M[x] = unit::S[(M[x] ^ V[x])] ^ M[y];
x = (++x) & h, y++;
M[y] = unit::S[(M[y] ^ U[y])] ^ M[x];
M[x] = unit::S[(M[x] ^ V[x])] ^ M[y];
x = (++x) & h, y++;
M[y] = unit::S[(M[y] ^ U[y])] ^ M[x];
M[x] = unit::S[(M[x] ^ V[x])] ^ M[y];
x = (++x) & h, y++;
M[y] = unit::S[(M[y] ^ U[y])] ^ M[x];
M[x] = unit::S[(M[x] ^ V[x])] ^ M[y];
x = (++x) & h, y++;
M[y] = unit::S[(M[y] ^ U[y])] ^ M[x];
M[x] = unit::S[(M[x] ^ V[x])] ^ M[y];
x = (++x) & h, y++;
M[y] = unit::S[(M[y] ^ U[y])] ^ M[x];
M[x] = unit::S[(M[x] ^ V[x])] ^ M[y];
x = (++x) & h, y++;
M[y] = unit::S[(M[y] ^ U[y])] ^ M[x];
M[x] = unit::S[(M[x] ^ V[x])] ^ M[y];
x = (++x) & h, y++;
M[y] = unit::S[(M[y] ^ U[y])] ^ M[x];
M[x] = unit::S[(M[x] ^ V[x])] ^ M[y];
x = (++x) & h, y++;
}
x = X >> i;
}
};