java - 密码分析的粒子群优化速度是多少?

标签 java cryptography particle-swarm cryptanalysis

我正在尝试实现用于密码分析本地搜索的粒子群优化算法,以查找简单替换密码的 key 。

我了解该方法的工作原理并实现了大部分算法,但我就是不知道如何计算速度。

粒子类别:

public class Particle extends Alphabet {
    public Vector velocity = new Vector();
    public char[] pbest;

    public Particle() {
        this.Scramble();
    }

    public char[] getPosition() {
        return this.getAlphabet();
    }
}

群体类别:

public class ParticleSwarm {
    public List<Particle> swarm = new ArrayList<>();
    private Fitness fitness = new Fitness();

    public void randomSwarm(int swarmSize) {
        for(int i = 0; i < swarmSize; i++) {
            swarm.add(new Particle());
        }
    }

    public Particle getBestParticle() {
        Particle swarmBest = new Particle();
        double bestScore = 0;
        for(int i = 0; i < swarm.size(); i++) {
            double newScore = fitness.score(swarm.get(i).getPosition());
            if(newScore >= bestScore) {
                bestScore = newScore;
                swarmBest = swarm.get(i);
            }
        }
        return swarmBest;
    }
}

粒子是我为另一种算法制作的字母表类的扩展,本质上是 26 个可打乱的字母表字母的 char 数组。粒子的“位置”(据我所知,它只是它的字母表,或者它的一些数字表示)。

群类非常不言自明,但包括一个适应度类,该类对粒子进行评分,得分在 0 到 1 之间(1 是最好的),代表 key 产生的英文文本量。

我遇到了该算法的实现(尽管没有代码),以找到维吉尼亚密码的 key ,它建议执行以下步骤:

查找实际 key 的建议算法

  1. PSO搜索算法参数初始化

PSO 参数在第一步中设置。这些参数包括粒子数量 (Np)、 key 大小 (Nd)、最大迭代次数 (Nt)、自信心因子 (C1)、群体置信因子 (C2) 和惯性权重 (w)。

  1. 离散鸟类或种群的初始化

a) 对于维吉尼亚密码的密码分析:粒子的初始位置是通过随机选择大小为 Nd 的排列来确定的,从整数 0 到 25 中均匀随机采样。 b) 使用以下方法初始化每个粒子的速度:

vi = vmin+(vmax - vmin) × rand 

其中: vi 是粒子 i 的速度 vmax 是最大速度, vmin 是最小速度, rand 是 0 到 1 之间的随机数。

  1. 列出项目

计算每个粒子的适应度函数值

a) 使用粒子的位置作为 key 解密密文。 b) 求步骤3(a)中得到的文本的适应度函数值。

  1. 更新粒子的速度和位置

按照步骤 3 中的讨论计算每个粒子的适应度函数值。

我似乎无法将公式粘贴到此处,但可以在第 426 页上看到:http://www.enggjournals.com/ijcse/doc/IJCSE13-05-05-064.pdf

最佳答案

对于 future 关注此问题的任何人,这就是我最终所做的:

由于单字母替换密码的 key 必须包含所有 26 个字母并且不能重复,因此正确实现速度很难。相反,(这是否是最好的解决方案是一个不同的故事)我取了 0 和 1 之间的 2 个数字 - 群体信心和自信 - 并会迭代 i 中的每 26 个字母大批。如果随机数介于 0 和群体置信度之间,则它将是群体中最佳 key 索引 i 处的字母。如果该数字大于群体置信度但小于或等于自置信度,则将重复相同的过程,但使用个人最佳 key 。如果这两个条件都不满足,则索引 i 处的字母将被保留,然后删除所有重复项。到目前为止,这已经给我带来了一些相当不错的结果。

关于java - 密码分析的粒子群优化速度是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22282440/

相关文章:

java - GPay InAppSubscription SetSku详​​情

java - 使用 Jelastic 的 Cron 作业

c - 彩虹表的实现

python - 粒子群中的粒子位置未正确参数化

algorithm - 使用粒子群优化的最短路径

javax持久化回滚异常

python - 如何使用 x509.load_pem_x509_certificate() Python 加密获取证书 CommonName?

security - 彩虹破解攻击和蛮力攻击

java - 人工神经网络 PSO 训练

java - 如何将 OpenOffice.org 作为后台进程运行以连接我的应用程序以使用 UNO Java API?