这有多安全

时间:2016-05-19 13:36:58

标签: java encryption hash password-encryption

为了使其更适用于其他人,我想知道写代码是多么逼真,它会将消息加密到没有密码就不可能被解密的程度。我认为最好的方法是制作哈希算法并添加随机性。那么业余爱好者编写声音加密有多现实?任何工程师都能破解业余加密算法吗? 编辑:几个答案讨论了对计算机内存的攻击,这是我很欣赏的有用信息,但我更感兴趣的是知道该消息是否可以直接解密。我假设cryptoanalyser无法访问计算机混淆消息,因为如果他这样做他无论如何都可以查看我的源代码并找到解密算法。 这是我的例子:

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;

}

4 个答案:

答案 0 :(得分:7)

不看你的代码 - 两个问题的两个答案:

  

那么业余爱好者编写声音加密有多现实?

不现实的。即使是专业的密码学家的实现也经常受到攻击,暴露,削弱。除了需要稳定的数学运算之外,还可以进行侧信道攻击(例如,在时序,功耗方面),并且可能会泄漏内存中遗留的数据。

简而言之:除非特别是您的业务,否则不值得实施您自己的加密。只需使用现有的实现。如果他们有缺陷,那么他们自己的将会更新的缺陷会更少。

  

任何工程师都能破解业余加密算法吗?

是。是的。因为你会犯新秀的错误。足够的人已经把手指烧成了不适当的加密算法。不要将自己添加到列表中。

如果你这样做 - 不要将其称为加密,而是将其命名为混淆。这是业余爱好者可以安全地做到的事情&#34;

答案 1 :(得分:4)

"Schneier's Law":&#34;任何人,从最无能的业余爱好者到最好的密码学家,都可以创建一个他自己无法破解的算法。&#34;

所以答案是编写自己的加密代码是不现实的,即使你是一位经验丰富的密码学家。

加密的最佳建议是使用当前标准:AES(高级加密标准)。

要将密码转换为密钥,请使用PBKDF2(基于密码的密钥派生功能2)。

答案 2 :(得分:2)

关于密码学的一般建议是:不要自己动手,而是使用公开的算法。这是一个非常简单的原因:即使是专业人士也很容易出错,所以建议只使用经过广泛测试的算法。此外,初学者更容易犯错误。

例如,让我们考虑一下你的代码:
private String passphrase;:您正在使用String来存储密码,因此即使在不再使用密码之后,它也会在内存中保留很长时间,甚至更长时间,因为事实,它是Object的属性。

只有每一秒的值都包含实际数据:这是“通过默默无闻的安全性”。好主意,正如Kerckhoff所述。此外,它是无用的开销,因为很容易恢复最终的可执行文件以获取实际的代码。

实际数据是一串randomnumber - actual data:我猜:Math.random()Random.nextInt()?那不是一个加密的安全PRNG。换句话说:另一个破坏加密的攻击媒介。

z添加到整体结果中是一个不错的主意,除了一个问题:z始终位于[-2, 2]范围内,因此不会为算法增加太多安全性。在最好的情况下,这会将工作量增加5倍,同时为算法增加额外的开销,从而使数据在RAM中更长。

一次加密所有内容:这使攻击者有足够的时间来保持普通密文和密文,因为在此期间,所有应加密的数据都保留在内存中。唯一可能更糟的是直接将攻击者的钥匙交给他。

这只是列表的开头,并且所有这些攻击向量都基于您发布的非常不完整的代码并且非常严重。打破这个算法对于任何专业人士来说都是孩子的游戏。

TL; DR

切勿将自制加密算法用于任何与安全相关的操作。它们是非常错误的,因此在大多数情况下 - 特别是在初学者建造时 - 很容易打破。

答案 3 :(得分:1)

这不安全。不要这样做。我会考虑这种专业的弊端。

而是研究和使用标准的对称或非对称密码术。