static void saacproto_jEncode(char *src,int srclen,int key,char *encoded,int *encodedlen,int maxencodedlen)
{
char sum=0;
int i;
if(srclen+1 > maxencodedlen){
*encodedlen = maxencodedlen;
for(i=0;i<(*encodedlen);i++)encoded[i] = src[i];
}
if(srclen+1 <= maxencodedlen){
*encodedlen=srclen+1;
for(i=0;i<srclen;i++){
sum = sum + src[i];
if(((key%7) == (i%5))||((key%2) == (i%2))) src[i] = ~src[i];
}
for(i=0;i<(*encodedlen);i++){
if(abs((key%srclen)) > i) encoded[i] = src[i] + sum*((i*i)%3);
if(abs((key%srclen)) == i) encoded[i] = sum;
if(abs((key%srclen)) < i) encoded[i] = src[i-1] + sum*((i*i)%7);
}
}
}
static void saacproto_jDecode(char *src,int srclen,int key,char *decoded,int *decodedlen)
{
char sum=0;
int i;
*decodedlen=srclen-1;
if( *decodedlen == 0 ){
return; /* return error if length is 0 */
}
sum = src[abs(key%(*decodedlen))];
for(i=0;i<srclen;i++){
if(abs((key%(*decodedlen))) > i) decoded[i] = src[i] - sum*((i*i)%3);
if(abs((key%(*decodedlen))) < i) decoded[i-1] = src[i] - sum*((i*i)%7);
}
for(i=0;i<(*decodedlen);i++){
if(((key%7) == (i%5))||((key%2) == (i%2)))decoded[i] = ~decoded[i];
}
}
var
sum:byte;
i:integer;
begin
sum:=0;
if srclen+1 > maxencodedlen then
begin
encodedlen := maxencodedlen;
for i:=0 to encodedlen-1 do
encoded[i] := src[i];
end;
if srclen+1 <= maxencodedlen then
begin
encodedlen:=srclen+1;
for i:=0 to srclen-1 do
begin
sum := sum + byte(src[i]);
if(((key mod 7) = (i mod 5)) or ((key mod 2) = (i mod 2))) then
src[i] := char(not byte(src[i]));
end;
for i:=0 to encodedlen-1 do
begin
if(abs((key mod srclen)) > i) then encoded[i] := char(integer(src[i]) + sum*((i*i) mod 3));
if(abs((key mod srclen)) = i) then encoded[i] := char(sum);
if(abs((key mod srclen)) < i) then encoded[i] := char(integer(src[i-1]) + sum*((i*i) mod 7));
end;
end;
end;
procedure saacproto_jDecode(src:pchar;srclen:integer; key:integer;decoded:pchar;var decodedlen:integer);
var
sum:byte;
i:integer;
begin
sum:=0;
decodedlen:=srclen-1;
if( decodedlen = 0 ) then
begin
exit; { return error if length is 0 }
end;
sum := byte(src[abs(key mod decodedlen)]); for i:=0 to srclen-1 do
begin
if abs(key mod decodedlen) > i then decoded[i] := char(integer(src[i]) - sum*((i*i) mod 3));
if abs(key mod decodedlen) < i then decoded[i-1] := char(integer(src[i]) - sum*((i*i) mod 7));
end;
for i:=0 to decodedlen-1 do
begin
if(((key mod 7) = (i mod 5)) or ((key mod 2) = (i mod 2))) then
decoded[i] := char( not byte(decoded[i]));
end;
end;