我正在尝试为密码分析本地搜索实现粒子群优化算法,以找到简单替换密码的密钥。
我理解这种方法的工作原理并实现了大部分算法,但我无法弄清楚如何计算速度。
粒子类:
public class Particle extends Alphabet {
public Vector velocity = new Vector();
public char[] pbest;
public Particle() {
this.Scramble();
}
public char[] getPosition() {
return this.getAlphabet();
}
}
Swarm Class:
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个字母的字符串,可以加扰。粒子的“位置”(据我所知,它只是它的字母表,或者它的一些数字表示)。
群体类是非常自我解释的,但包括一个健身类,它对得分为0到1(1为最佳)的粒子进行评分,表示该密钥产生的英文文本量。
我遇到了这个算法的实现(尽管没有代码)找到了vigenere密码的关键,它提出了以下步骤:
用于查找实际密钥的建议算法
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
答案 0 :(得分:0)
对于将来看这个的人来说,这就是我最终做的事情:
由于单字母替换密码的密钥必须包含所有26个字母且不能重复,因此速度很难正确实现。相反,(这是否是最好的解决方案是一个不同的故事)我在0和1之间取了2个数字 - 一群信心和自信 - 并且会通过每个26个字母迭代 i 阵列。如果随机数介于0和群体置信度之间,那么它将是来自群的最佳密钥的索引 i 处的字母。如果数量超过群体信心但小于或等于自信心,则会重复相同的过程,但使用个人最佳密钥。如果这些条件都不满足,则保留索引i处的字母,然后删除所有重复项。到目前为止,这已经给我带来了一些相当不错的结果。