Ce code fait le codage d'une chaine de deux caractères mais vous pouvez augmenT la dimension de la chaine en changeant DIMENSION et CYPHER_HILL par une clé matricielle "e" (Dfinit dans une variable private au Dbut de la classe voir code)
Source / Exemple :
package javafr;
import java.lang.Exception;
/**
*
- @author scupper
- @since 16:33 March 23rd 2011
*
public class CodeHill {
private static int[][] HILL_KEY={{3,6},
{1,5}};
//faudrait que pgcd(det(HILL_KEY), 26) = 1
private static int DIMENSION = 2;
public int getDimension(){
return this.DIMENSION;
}
public void setDimension(int dimension){
this.DIMENSION=dimension;
}
public void setKey(int[][] key) throws Exception{
boolean bool = true;
for(int i=0;i<this.DIMENSION;i++){
bool = bool & ((key[i].length==this.DIMENSION)?true:false);
}
if(key.length != this.DIMENSION && bool){
throw new Exception("Error : Bad Array Initialisation");
}else{
for(int i =0; i<2;i++){
for(int j =0;j<2;j++){
this.HILL_KEY[i][j]=key[i][j];
}
}
}
}
public int[][] getKey(){
int[][] key = new int[2][2];
for(int i =0; i<2;i++){
for(int j =0;j<2;j++){
key[i][j]=this.HILL_KEY[i][j];
}
}
return key;
}
public StringBuffer cypher(StringBuffer str,int[][] key,int dimension){
StringBuffer s = new StringBuffer();
char c;
setDimension(dimension);
int[][] nKey = new int[this.DIMENSION][this.DIMENSION];
for(int i=0;i<key.length;i++){
for(int j =0;j<key[i].length;j++){
nKey[i][j]=key[i][j]%26;
}
}
try {
setKey(nKey);
} catch (Exception ex) {
System.out.println(ex.getMessage());
System.exit(this.DIMENSION);
}
StringBuffer nStr=new StringBuffer(str.toString().toUpperCase());
if(str.length()!=this.DIMENSION){
try {
throw new Exception("Error : the String Length should be : " + this.DIMENSION);
} catch (Exception ex) {
System.out.println(ex.getMessage());
System.exit(DIMENSION);
}
}
int[] code = new int[this.DIMENSION];
for(int i =0;i<this.DIMENSION;i++){
int cod = 0;
for(int j = 0;j<this.DIMENSION;j++){
c = nStr.charAt(j);
cod +=(((int)c - 65) * nKey[j][i]);
}
cod = (cod%26)+65;
code[i] = cod;
s.append((char)code[i]);
}
return s;
}
public static void main(String[] args){
CodeHill obj = new CodeHill();
for(int i =0;i<DIMENSION;i++){
System.out.println(obj.cypher( new StringBuffer("MO"), HILL_KEY,2));
}
}
}
Conclusion :
pour le cas de DMENSION =2 on a pour le e spécifier
run:
YM
YM
BUILD SUCCESSFUL (total time: 1 second)