加密单个int的方法

ʞɔı*_*ɔıu 9 language-agnostic encryption algorithm

你怎么能廉价地双向加密一个32位的int,这样每个数字都映射到那个空间中的其他int并以一种难以预测的方式返回?

当然,并不需要在映射表中预先存储42.9亿个整数.

The*_*ran 19

你想要的是一个32位分组密码.不幸的是,由于短块大小弱点,大多数块密码是64位或更多.如果你可以处理加密的int是输入的两倍,那么你可以使用Blowfish,TDES或其他一些经过良好审查的64位分组密码.

如果你确实需要32位并且不介意降低安全性,那么它很容易将像Blowfish这样的Feistel网络密码修剪到任何块长度,该块长度是起始密码的2倍且小于起始密码.对于Blowfish,只需在两个半块之间均匀地分割输入数字,然后将F函数的输出和P值减小到目标块大小的1/2.这可以在照常输入算法之后完成.


Zif*_*fre 7

显然,你需要某种随机密钥才能保证安全.在这种情况下:

int original = 42;
int key = give_me_a_random_int();

int encrypted = original ^ key;
int unencrypted = encrypted ^ key;

// now, unencrypted == original == 42
Run Code Online (Sandbox Code Playgroud)

这只是一个简单的异或.XORing将再次扭转这一过程.

此外,我应该注意,这只适用于一次使用.它被称为一次性垫.如果您对非随机数据使用相同的密钥两次,则攻击者可能会对其进行解密.

  • 如果纯文本中存在任何模式或偏差,则当使用相同密钥加密的两条消息一起进行异或时,它们将显示出来.(A ^ K)^(B ^ K)= A ^ B. (4认同)
  • 2 ^ 32也不是一个非常大的暴力关键空间. (2认同)

Emr*_*ici 5

使用32位块密码,skip32是我找到的唯一一个:http://www.qualcomm.com.au/PublicationsDocs/skip32.c