我正在尝试实现用于密码分析本地搜索的粒子群优化算法,以查找简单替换密码的 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 的建议算法
- PSO搜索算法参数初始化
PSO 参数在第一步中设置。这些参数包括粒子数量 (Np)、 key 大小 (Nd)、最大迭代次数 (Nt)、自信心因子 (C1)、群体置信因子 (C2) 和惯性权重 (w)。
- 离散鸟类或种群的初始化
a) 对于维吉尼亚密码的密码分析:粒子的初始位置是通过随机选择大小为 Nd 的排列来确定的,从整数 0 到 25 中均匀随机采样。 b) 使用以下方法初始化每个粒子的速度:
vi = vmin+(vmax - vmin) × rand
其中: vi 是粒子 i 的速度 vmax 是最大速度, vmin 是最小速度, rand 是 0 到 1 之间的随机数。
- 列出项目
计算每个粒子的适应度函数值
a) 使用粒子的位置作为 key 解密密文。 b) 求步骤3(a)中得到的文本的适应度函数值。
- 更新粒子的速度和位置
按照步骤 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/