我对任何类型的解密都是完全的初学者。我写了一个类,我认为它应该是非常安全的。你能就如何改进算法给我建设性的批评吗?
package main;
import java.util.Random;
public class Main {
public static void main(String[] args) {
//we will be playing around with this string
new Main("1234567890abc");
}
private Random rnd;
private byte[] randoms;
/**
* Starts up RNG
* Prints out a test
*/
public Main(String password) {
//random long generated from the password
long randomLong = randomNumber(password);
//Random class using randomLong as seed
rnd = new Random(randomLong);
randoms = new byte[password.length()];
//Array of random bytes generated with rnd
rnd.nextBytes(randoms);
System.out.println(randomNumber(password));
String cryped = encrypt(password);
String decryped = decrypt(cryped);
System.out.println(cryped);
System.out.println(decryped);
}
/**
* Encrypts the password.
*/
private String encrypt(String password) {
char[] chars = password.toCharArray();
for (int i = 0; i < chars.length; i++) {
chars[i] = (char) (chars[i] + randoms[i]);
}
return String.valueOf(chars);
}
/**
* Decrypts an allready encryped password.
*/
private String decrypt(String crypted) {
char[] chars = crypted.toCharArray();
for (int i = 0; i < chars.length; i++) {
chars[i] = (char) (chars[i] - randoms[i]);
}
return String.valueOf(chars);
}
/**
* Finds a random number BASED ON PASSWORD
*/
private long randomNumber(String password)
{
char[] chars = password.toCharArray();
long number = 0;
for (char c : chars) {
number += c;
}
number *= chars.length;
return number;
}
}这个类是用Java编写的,但应该是任何人都可以读的。
发布于 2011-06-06 16:04:37
发布于 2011-06-06 16:01:50
以一种以上的方式可怕地破碎。
,
,
假设攻击者知道encrypt(p1)和encrypt(p2)。然后,他可以计算出与p1-p2.
encrypt(p1)-encrypt(p2),有效密钥大小远远小于64bit。字符串中的字符总和小于2^16*长度。对于大多数字符,它甚至是<128。所以你的key通常是一个小于1000‘000的数字。
randoms中的每个元素都是一个字节,即8位。字符是16位的。所以你不是在加256模。因此,您泄漏了有关加密密码的信息。为了改进它,完全丢弃你自己的算法,使用一个众所周知的,经过审查的算法。发明自己的算法不是个好主意,除非你是密码学专家。即使是专家也会相对频繁地犯错误。
您是否真的需要密码解密(例如,它是一个密码存储),还是密码散列足够了?
我的建议是将您的主密码放在密钥派生函数中(PKDF2是一个常见的选择)。然后使用此函数返回的密钥,通过AES对数据文件的其余部分进行加密。
https://stackoverflow.com/questions/6249149
复制相似问题