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

时间:2014-03-09 12:57:00

标签: java cryptography particle-swarm cryptanalysis

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

我理解这种方法的工作原理并实现了大部分算法,但我无法弄清楚如何计算速度。

粒子类:

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密码的关键,它提出了以下步骤:

用于查找实际密钥的建议算法

  1. PSO搜索算法参数的初始化
  2. PSO参数在第一步中设置。这些参数包括粒子数(Np),键的大小(Nd),最大迭代次数(Nt),自信因子(C1),Swarm置信因子(C2)和惯性权重(w)。

    1. 离散鸟类或种群的初始化
    2. a)对于vigenere密码的密码分析:通过随机选择大小为Nd的排列来确定粒子的初始位置,从0到25的整数随机均匀地采样。 b)使用以下方法初始化每个粒子的速度:

      vi = vmin+(vmax - vmin) × rand 
      

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

      1. 列表项
      2. 计算每个粒子的适应度函数值

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

        1. 更新粒子的速度和位置
        2. 计算每个粒子的适应度函数值,如步骤3中所述。

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

1 个答案:

答案 0 :(得分:0)

对于将来看这个的人来说,这就是我最终做的事情:

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