C++11 如果我有密钥&;一个数字

C++11 如果我有密钥&;一个数字,c++11,hash,encryption-symmetric,C++11,Hash,Encryption Symmetric,我有一个小例程,它组成了一个累积XOR散列。这就好像是一个储蓄账户,它每天都在增加。。但从这个意义上说,答案是累积产生的,关键总是存在的 我已经吃了一串苦头 伪代码: char H[10] = { "ABCDEFGHI", "\0" }; 我使用了9个32位的数字密钥在XOR加密中对它们进行散列 我是这样做的: for (i;i<10;i++) bitset<32> K ^= H[i] ^ NUMKEY[i]; 还有其他数学吗?我想我必须取X并做一点K-X来找到真正

我有一个小例程,它组成了一个累积XOR散列。这就好像是一个储蓄账户,它每天都在增加。。但从这个意义上说,答案是累积产生的,关键总是存在的

我已经吃了一串苦头

伪代码:

char H[10] = { "ABCDEFGHI", "\0" };
我使用了9个32位的数字密钥在XOR加密中对它们进行散列

我是这样做的:

for (i;i<10;i++)
    bitset<32> K ^= H[i] ^ NUMKEY[i];
还有其他数学吗?我想我必须取
X
并做一点
K-X
来找到真正的导数

这是我目前的例行程序。但我没有得到我想要的

for_each (std::istreambuf_iterator<char>(in), \
    std::istreambuf_iterator<char>(), \
    [&] (long x) {
    t=s_nop(t,0);
    cred.push_back(t);
    alpha = static_cast<long>(cred[size]);
    delta = static_cast<long>(x);
    lambda ^= (alpha ^ delta);
    size++;
});

for (;i<bn;i++) {
    alpha =  static_cast<unsigned long>(cred[bn-1-i]);
    int m = lambda.to_ulong(), n = alpha.to_ulong();

    long hash1 = abs((m-n-1)%256-1);
    delta = static_cast<unsigned long>(hash1);
    btrace.push_back(hash1);
    cout << hash1 << " ";
}
for_each(std::istreambuf_迭代器(in)\
std::istreambuf_迭代器()\
[&](长x){
t=s_-nop(t,0);
信任推回(t);
alpha=静态铸件(cred[尺寸]);
δ=静态_型铸造(x);
λ^=(α^δ);
大小++;
});

对于(;i我认为您可能真正想要的是一个一次性的pad(代码片段是javascript,作为向该方向移动的伪代码)

//忽略前3个函数(它们仅用于打印输出)
函数附录行(文本、目标、空格、颜色){
var行=document.createElement(“div”);
line.style.border=“1px solid”+颜色;
line.style.padding=line.style.margin=space;
line.style[“字体系列”]=“monospace”;
line.appendChild(document.createTextNode(text));
target.appendChild(行);
回流线;
}
函数makeSection(标题){
var d=附录行(标题,document.body,“5px”,“#dddddd”);
var结果=document.createElement(“div”);
d、 结果;
返回函数(结果){
附录行(结果,结果,“2px”和“eeee”);
};
}
函数toHex(arr){
返回arr.map(函数(n){
var h=(n>>>0).toString(16).toUpperCase();
而(h.length<8)h=“0”+h;
返回h;
}).加入(“,”);
}
//你的信息
var H=“ABCDEFGHI”.split(“”.map(函数(c){return c.charCodeAt(0)});
//您的秘密编码密钥
var NUMKEY=Array.apply(null,数组(9)).map(函数(){return Math.random()*Math.pow(2,32)});
//你在干什么
(功能(){
var section=makeSection(“你在做什么:”);
节(“ABCDEFGHI作为32位数字的数组:“+toHex(H));
第节(“NUMKEY:+toHex(NUMKEY));
var K=0;
对于(变量i=0;i<10;i++){
K^=H[i]^NUMKEY[i];
}
第节(“K:+toHex([K]);
var X=0;
对于(变量i=0;i<10;i++){
X^=K^NUMKEY[i];
}
第节(“X:+toHex([X]);
})();
//你想做什么
(功能(){
var section=makeSection(“您试图做的事情:”);
节(“ABCDEFGHI作为32位数字的数组:“+toHex(H));
第节(“NUMKEY:+toHex(NUMKEY));
var Hs_XORd=0;
对于(变量i=0;i<10;i++){
Hs_XORd^=H[i];
}
第节(“H的异或合在一起:+toHex([Hs_XORd]));
var NUMKEYs_XORd=0;
对于(变量i=0;i})()
XOR是可交换的,您可以预先计算NUMKEYs的XOR,并在任何一个操作结束时应用它。将所有值一起XOR,然后按预先计算的值XOR进行加密。对于解密,不必重复对密钥本身进行XOR运算,只需对预先计算的值执行一次XOR运算即可获得XOR运算的原始结果这就是你想要的吗?如果你想要你的原始值,你不能将它们异或在一起(除非你想通过对其他九个值进行异或来恢复一个值)你能给我一个代码示例吗?听起来你知道我需要什么。谢谢你的输入。@dturythank你。我将发布另一个关于这个问题的问题。我已经到了一个地步,我通过一个自制的算法从序列中得到散列数。一旦我得到了代码,我会马上问。顺便说一句,我正试图打败一个键盘事情。@thexiv啊,我想我明白了,你是在试图发明一个散列,而不是密码。将所有的值XOR在一起是一个散列,但远不是任何加密的东西(如果这是你的目标的话,在避免冲突方面不是很好).coursera上的Stanford crypto课程非常好。是的,我是。我对加密部分不感兴趣。我只是想使用XOR,因为这似乎是一个很酷的想法。我实际上是为了压缩。我可以避免冲突,这很简单。我只需要一个唯一的数字列表。我可以通过简单的双重检查计算来做到这一点lus算法。我还可以在循环中使用迭代,从循环中获取字符。I++;同样可以是唯一的。使用它并不有趣。:)XOR非常酷,非常有趣……另一个可能适用的有趣方法是模幂运算。祝你好运(并继续玩得开心!)!如果不是你意识到你应该问的问题,这是否回答了你问的问题?(是的,我在寻找积分)
for_each (std::istreambuf_iterator<char>(in), \
    std::istreambuf_iterator<char>(), \
    [&] (long x) {
    t=s_nop(t,0);
    cred.push_back(t);
    alpha = static_cast<long>(cred[size]);
    delta = static_cast<long>(x);
    lambda ^= (alpha ^ delta);
    size++;
});

for (;i<bn;i++) {
    alpha =  static_cast<unsigned long>(cred[bn-1-i]);
    int m = lambda.to_ulong(), n = alpha.to_ulong();

    long hash1 = abs((m-n-1)%256-1);
    delta = static_cast<unsigned long>(hash1);
    btrace.push_back(hash1);
    cout << hash1 << " ";
}