这有多安全
How secure is this
为了使它更适用于其他人,我想知道将消息加密到没有密码就不可能解密的程度的编写代码有多现实。我认为最好的方法是制作哈希算法并添加随机性。那么一个代码爱好者写出声音加密有多现实呢?任何工程师都能够破解业余加密算法吗?
编辑:一些答案讨论了对计算机内存的攻击,这是我很欣赏的有用信息,但我更想知道是否可以直接解密消息。我假设密码分析器无法访问混淆消息的计算机,因为如果他这样做了,他无论如何都可以查看我的源代码并找到解密算法。
这是我的例子:
public class Keys { // hold the methods and information used to lock, unlock, make the key, get the "keypad" after it has been locked, and a static method to change int[] to long[]
// Fields
private String passphrase;
private long[] key;
private long keynum;
private long[] pad;
Random rands = new Random();
// Constructors
public Keys (String passphrase) // makes a key based of the given passphrase
{
this.passphrase = passphrase;
key = keycipher(this.passphrase.toCharArray());
key = keyfix(key);
keynum = key[0];
for (int i=1; i < key.length && key[i] != 0; i=i+1)
if (i <key.length -1 && key[i] == key[i+1])
keynum = keynum *key[i] +1;
else if (i+1 < key.length)
keynum = keynum * key[i] - key[i+1];
else
keynum = keynum * key[i] -1;
}
/**
*used to lock and save a message in the pad field
* @param message2lock the input which will be locked using the key and saved as the field pad
*/
public void lock (String message2lock)
{
Message2Num holenums = new Message2Num(message2lock); // message2nums converts inout string to number []
holenums.step1(); //uses custom cipher to change each character to a long
long[] hole =new long[holenums.step2().length];
int t =0;
for(int g : holenums.step2())
/* // Step 2 uses the cipher from step 1 and hides it in random numbers by doubling the array length
then making every even number in the array length a random number and every odd number the last random number
minus the original cipher number
*/
{
hole[t] = (long) g;
t++;
}
hole = this.padding(hole);
double p = (double) keynum;
p = 3* Math.cos(p);
long z = (long) p;
for ( int i =0; i< hole.length; i++)
hole[i] = hole[i] * keynum + z;
hole = Message2Num.addcommas(hole);
pad =hole;
}
不看你的代码 - 两个问题的两个答案:
So how realistic is it for a code amateur to write sound encryption?
不现实。即使是专业密码学家的实现也会不断受到攻击、暴露和削弱。除了需要扎实的数学运算之外,侧信道攻击(例如在时序、功耗方面)也是可能的,并且您可能会泄漏内存中遗留的数据。
简而言之:除非这是您的业务,否则不值得实施您自己的加密。只需使用现有的实现即可。如果它们有缺陷,它们的缺陷会比您自己的 和 更新的缺陷少。
Would any engineer be able to crack amateur encryption algorithms?
是的。是的。因为你会犯新手错误。有足够多的人因加密算法的不当实施而受伤。不要将自己添加到列表中。
如果你这样做 - 不要称之为加密,而是将其命名为混淆。这是业余爱好者可以做的事情 "safely"
有一个关于密码学的一般建议:不要自己推出,而是使用公开可用的算法。这是出于一个非常简单的原因:即使是专业人士也很容易出错,因此建议仅使用经过广泛测试的算法。此外,初学者更容易出错。
例如,让我们考虑一下您的代码:
private String passphrase;
:您正在使用 String
来存储密码,因此它会在内存中保留相当长的时间,即使它不再被使用,甚至更长的时间,因为,它是 Object
的一个属性。
只有每个第二个值包含实际数据:即 "security through obscurity"。坏主意,正如 Kerckhoff 所述。此外,它是无用的开销,因为还原最终可执行文件以获取实际代码非常容易。
实际数据是一串randomnumber - actual data
:让我猜猜是:Math.random()
,还是Random.nextInt()
?那不是加密安全的 PRNG。换句话说:另一个破解加密的攻击向量。
将 z
添加到总体结果是一个不错的主意,除了一个问题:z
始终位于 [-2, 2]
范围内,因此不会增加太多安全性算法。在最好的情况下,这会将工作量增加 5 倍,同时会增加算法的额外开销,从而使数据在 RAM 中的时间更长。
一次加密所有内容:这使攻击者有足够的时间来掌握明文和密文,因为在此期间,所有应加密的数据都保留在内存中。唯一可能更糟的是直接将密钥交给攻击者。
这只是列表的开始,所有这些攻击向量都是基于您发布的非常不完整的代码并且非常严重。打破这个算法对任何专业人士来说都是小儿科。
TL;DR
切勿将您自制的加密算法用于任何与安全相关的事情。它们极易出错,因此在大多数情况下——尤其是初学者构建时——很容易出错。
"Schneier's Law": "Anyone, from the most clueless amateur to the best cryptographer, can create an algorithm that he himself can't break."
所以答案是自己编写加密代码是不现实的,即使你是一位经验丰富的密码学家。
加密的最佳建议是使用当前标准:AES(高级加密标准)。
要将密码转换为密钥,请使用 PBKDF2(基于密码的密钥派生函数 2)。
这不安全。不要这样做。我会考虑这种职业失职。
而是研究和使用标准的对称或非对称密码学。
为了使它更适用于其他人,我想知道将消息加密到没有密码就不可能解密的程度的编写代码有多现实。我认为最好的方法是制作哈希算法并添加随机性。那么一个代码爱好者写出声音加密有多现实呢?任何工程师都能够破解业余加密算法吗? 编辑:一些答案讨论了对计算机内存的攻击,这是我很欣赏的有用信息,但我更想知道是否可以直接解密消息。我假设密码分析器无法访问混淆消息的计算机,因为如果他这样做了,他无论如何都可以查看我的源代码并找到解密算法。 这是我的例子:
public class Keys { // hold the methods and information used to lock, unlock, make the key, get the "keypad" after it has been locked, and a static method to change int[] to long[]
// Fields
private String passphrase;
private long[] key;
private long keynum;
private long[] pad;
Random rands = new Random();
// Constructors
public Keys (String passphrase) // makes a key based of the given passphrase
{
this.passphrase = passphrase;
key = keycipher(this.passphrase.toCharArray());
key = keyfix(key);
keynum = key[0];
for (int i=1; i < key.length && key[i] != 0; i=i+1)
if (i <key.length -1 && key[i] == key[i+1])
keynum = keynum *key[i] +1;
else if (i+1 < key.length)
keynum = keynum * key[i] - key[i+1];
else
keynum = keynum * key[i] -1;
}
/**
*used to lock and save a message in the pad field
* @param message2lock the input which will be locked using the key and saved as the field pad
*/
public void lock (String message2lock)
{
Message2Num holenums = new Message2Num(message2lock); // message2nums converts inout string to number []
holenums.step1(); //uses custom cipher to change each character to a long
long[] hole =new long[holenums.step2().length];
int t =0;
for(int g : holenums.step2())
/* // Step 2 uses the cipher from step 1 and hides it in random numbers by doubling the array length
then making every even number in the array length a random number and every odd number the last random number
minus the original cipher number
*/
{
hole[t] = (long) g;
t++;
}
hole = this.padding(hole);
double p = (double) keynum;
p = 3* Math.cos(p);
long z = (long) p;
for ( int i =0; i< hole.length; i++)
hole[i] = hole[i] * keynum + z;
hole = Message2Num.addcommas(hole);
pad =hole;
}
不看你的代码 - 两个问题的两个答案:
So how realistic is it for a code amateur to write sound encryption?
不现实。即使是专业密码学家的实现也会不断受到攻击、暴露和削弱。除了需要扎实的数学运算之外,侧信道攻击(例如在时序、功耗方面)也是可能的,并且您可能会泄漏内存中遗留的数据。
简而言之:除非这是您的业务,否则不值得实施您自己的加密。只需使用现有的实现即可。如果它们有缺陷,它们的缺陷会比您自己的 和 更新的缺陷少。
Would any engineer be able to crack amateur encryption algorithms?
是的。是的。因为你会犯新手错误。有足够多的人因加密算法的不当实施而受伤。不要将自己添加到列表中。
如果你这样做 - 不要称之为加密,而是将其命名为混淆。这是业余爱好者可以做的事情 "safely"
有一个关于密码学的一般建议:不要自己推出,而是使用公开可用的算法。这是出于一个非常简单的原因:即使是专业人士也很容易出错,因此建议仅使用经过广泛测试的算法。此外,初学者更容易出错。
例如,让我们考虑一下您的代码:
private String passphrase;
:您正在使用 String
来存储密码,因此它会在内存中保留相当长的时间,即使它不再被使用,甚至更长的时间,因为,它是 Object
的一个属性。
只有每个第二个值包含实际数据:即 "security through obscurity"。坏主意,正如 Kerckhoff 所述。此外,它是无用的开销,因为还原最终可执行文件以获取实际代码非常容易。
实际数据是一串randomnumber - actual data
:让我猜猜是:Math.random()
,还是Random.nextInt()
?那不是加密安全的 PRNG。换句话说:另一个破解加密的攻击向量。
将 z
添加到总体结果是一个不错的主意,除了一个问题:z
始终位于 [-2, 2]
范围内,因此不会增加太多安全性算法。在最好的情况下,这会将工作量增加 5 倍,同时会增加算法的额外开销,从而使数据在 RAM 中的时间更长。
一次加密所有内容:这使攻击者有足够的时间来掌握明文和密文,因为在此期间,所有应加密的数据都保留在内存中。唯一可能更糟的是直接将密钥交给攻击者。
这只是列表的开始,所有这些攻击向量都是基于您发布的非常不完整的代码并且非常严重。打破这个算法对任何专业人士来说都是小儿科。
TL;DR
切勿将您自制的加密算法用于任何与安全相关的事情。它们极易出错,因此在大多数情况下——尤其是初学者构建时——很容易出错。
"Schneier's Law": "Anyone, from the most clueless amateur to the best cryptographer, can create an algorithm that he himself can't break."
所以答案是自己编写加密代码是不现实的,即使你是一位经验丰富的密码学家。
加密的最佳建议是使用当前标准:AES(高级加密标准)。
要将密码转换为密钥,请使用 PBKDF2(基于密码的密钥派生函数 2)。
这不安全。不要这样做。我会考虑这种职业失职。
而是研究和使用标准的对称或非对称密码学。