/* **************************************
"braidpkc.cpp"
公開鍵暗号系の設計に必要な関数−実現部
************************************** */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "list.h"
#include "braid.h"
#include "canonical.h"
#include "make_canonical.h"
#include "braidpkc.h"
#include "md5.h"
// ランダムにブレイドを生成
void create_random(List& L,int l) {
// 時間をシードに乱数を発生させる
time_t t;
time(&t);
srand((unsigned int)t);
int x;
Cell* p=L.Init();
do{
x=rand()%(L.Num()*2); // x:1から2n-1までの整数
if(x!=0){
x-=L.Num(); // x:-n+1からn-1までの整数
if(x!=0){
L.Insert(p,x);
p=L.Next(p);
l--;
}
}
}while(l>0);
}
// 生成元をn本ずらす
void shift_braid(List& L,int n){
Cell* p=L.Next(L.Init());
int e;
do{
e=L.Element(p);
if(e>0) e+=n; else e-=n;
L.Set_element(p,e);
p=L.Next(p);
}while(p!=L.Last());
}
// y=axa^-1を計算
void product_conj(Canonical& a,Canonical& x,Canonical& y){
Canonical a_inverse; inverse(a,a_inverse);
Canonical ax; product(a,x,ax);
product(ax,a_inverse,y);
}
// 紐の交差の状態を調べる
int cross_strings(Canonical& C,int CS[]){
List L; C.GList(L);
int i,j;
int CRS[L.Num()+1][L.Num()+1]; // 交差を記録
for(i=1;i<=L.Num();i++)
for(j=1;j<=L.Num();j++) CRS[i][j]=0;
int S[L.Num()+1]; // 紐の動きを記録
for(i=1;i<=L.Num();i++) S[i]=i;
int x,tmp,k=0;
Cell* p=L.Next(L.Init());
do{
x=L.Element(p);
tmp=S[x]; S[x]=S[x+1]; S[x+1]=tmp;
i=S[x]; j=S[x+1];
if(CRS[i][j]==1){ // ここまでが順列ブレイド
// CRSをCSに記録
for(i=1;i<L.Num();i++){
for(j=i+1;j<=L.Num();j++){
CS[k]=CRS[i][j]; k++;
}
}
// CRSをリセット
for(i=1;i<=L.Num();i++)
for(j=1;j<=L.Num();j++) CRS[i][j]=0;
// Sをリセット
for(i=1;i<=L.Num();i++) S[i]=i;
}else{
CRS[i][j]=CRS[j][i]=1;
p=L.Next(p);
}
}while(p!=L.Last());
// CRSをCSに記録
for(i=1;i<L.Num();i++){
for(j=i+1;j<=L.Num();j++){
CS[k]=CRS[i][j]; k++;
}
}
return k;
}
// ハッシュ関数
void hash_md5(int D[],int size,int H[]){
int i;
FILE* fp=fopen("data.txt","w");
for(i=0;i<size;i++) fprintf(fp,"%d",D[i]);
fclose(fp);
MD5_CTX mdContext=MDFile("data.txt");
for(i=0;i<16;i++) H[i]=mdContext.digest[i];
}
// 排他的論理和
int exclusive_or(int H[],char M[],int D[]){
int i,j,len=16;
if(strlen(M)>16) len=strlen(M);
for(i=0,j=0;i<len;i++,j++){
if(j==16) j=0;
D[i]=H[j]^M[i];
}
return len;
}
// 排他的論理和
void exclusive_or(int D[],int H[],int len,char M[]){
int i,j;
for(i=0,j=0;i<len;i++,j++){
if(j==16) j=0;
M[i]=D[i]^H[j];
}
}