我正在尝试为密码分析本地搜索实现粒子群优化算法,以找到简单替换密码的密钥。
我了解这种方法如何工作的理论并且已经实现了大部分算法,但我就是不知道如何计算速度。
粒子类:
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 数组。粒子的“位置”(据我所知,它只是它的字母表,或者它的一些数字表示)。
swarm 类很容易解释,但包括一个适应度类,它给粒子评分在 0 到 1 之间(1 是最好的),代表键产生的英文文本的数量。
我遇到了这个算法的实现(虽然没有代码)找到建议这些步骤的 vigenere 密码的密钥:
用于查找实际密钥的建议算法
- PSO 搜索算法参数的初始化
PSO 参数在第一步中设置。这些参数包括粒子数 (Np)、密钥大小 (Nd)、最大迭代次数 (Nt)、自信心因子 (C1)、Swarm 置信因子 (C2) 和惯性权重 (w)。
- 离散鸟类或种群的初始化
a) 对于 vigenere 密码的密码分析:粒子的初始位置通过随机选择大小 Nd 的排列来确定,从整数 0 到 25 随机均匀采样。 b) 使用以下方法初始化每个粒子的速度:
vi = vmin+(vmax - vmin) × rand
其中:vi 是粒子 i 的速度 vmax 是最大速度,vmin 是最小速度,rand 是 0 到 1 之间的随机数。
- 项目清单
计算每个粒子的适应度函数值
a) 以粒子的位置为密钥解密密文。b) 求步骤 3 (a) 中得到的文本的适应度函数值。
- 更新粒子的速度和位置
计算步骤 3 中讨论的每个粒子的适应度函数值。
我似乎无法将公式粘贴到此处,但可以在此处的第 426 页上看到:http ://www.enggjournals.com/ijcse/doc/IJCSE13-05-05-064.pdf