“程序设计”目录存档

用C语言实现凯撒密码算法

2010年06月7日,星期一

昨天完成了VBS的凯撒密码算法,然后发现Google出来的C语言的凯撒密码算法乱七八糟,很多都是复制粘贴的,还不注明转载地址,连最先的出处都找不到。唉,天下文章一大抄。很多时候,碰到问题Google出来的都是千篇一律的答案,千篇一律也就罢了,还都是没有用的,真受不了。什么?百度一下?百度一下更加什么都不知道!

原来以为C语言的很好写,想不到写了一个小时才写完(不要鄙视我,我承认我是菜鸟),太久没写程序,卡在指针上面了。以下是我写的凯撒密码的C语言算法。你要Java的?对不起,我是一个守旧的人,我不喜欢Java。但是原理都一样吧,不记得在哪里看过一个话,语言并不重要,重要的是算法,语言是会过时的,但是算法不会。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *caesar(const char *str,int offset)
{
	char *start,*ret_str;
	start = ret_str = (char *) malloc(strlen(str) + 1);
	for(;*str!='\0';str++,ret_str++)
	{
		if(*str>='A' && *str<='Z')
			*ret_str = 'A' + (*str - 'A' + offset) % 26;
		else if(*str>='a' && *str<='z')
			*ret_str = 'a' + (*str - 'a' + offset) % 26;
		else
			*ret_str = *str;
	}
	*ret_str = '\0';
	return (char *) start;
}

int main(void)
{
	printf("%s\n","ABCDEFGHIJKLMNOPQRSTUVWXYZ");
	printf("%s\n",caesar("ABCDEFGHIJKLMNOPQRSTUVWXYZ",3));
	return 0;
}

用VBS实现凯撒密码算法

2010年06月5日,星期六

在密码学中,恺撒密码(或称恺撒加密、恺撒变换)是一种最简单且最广为人知的加密技术。它是一种替换加密的技术,明文中的所有字母都在字母表上向後(或向前)按照一个固定数目进行偏移後被替换成密文。例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推。这个加密方法是以恺撒的名字命名的,当年恺撒曾用此方法与其将军们进行联系。

例如,当偏移量是左移3的时候(解密时的密钥就是3):

明文字母表:ABCDEFGHIJKLMNOPQRSTUVWXYZ
密文字母表:DEFGHIJKLMNOPQRSTUVWXYZABC

以上都是废话啦,最近在教一个小朋友VBS,给她出了一道题,让她实现凯撒密码算法,不过貌似有点难了。Google了一下凯撒密码,出来的基本都是C和Java的实现,还是我自己写吧。

Function Caesar(str,offset)
	Dim length,char,i
	Caesar = ""
	length = Len(str)
	For i = 1 To length
		char = Mid(str,i,1)
		If char >= "A" And char <= "Z" Then
			char = Asc("A") + (Asc(char) - Asc("A") + offset) Mod 26
			Caesar = Caesar & Chr(char)
		ElseIf char >= "a" And char <= "z" Then
			char = Asc("a") + (Asc(char) - Asc("a") + offset) Mod 26
			Caesar = Caesar & Chr(char)
		Else
			Caesar = Caesar & char
		End If
	Next
End Function

WScript.Echo Caesar("ABCDEFGHIJKLMNOPQRSTUVWXYZ",3)

WordPress的默认主题真不好使,代码竟然溢出了,将就着看吧,或者给我推荐一个好看点的主题也行。

PHP & JavaScript: UTF-16 to UTF-8

2010年06月3日,星期四

外国的一个博客上摘录的,原文如下(附上我的烂翻译):

Recently I’ve been doing some work on a PHP script that has to process a bunch of XML files (in this case they’re imsmanifest files) however a few of them weren’t being parsed successfully.

最近我在做一些用PHP处理一堆XML文件的工作(它们是imsmanifest文件),然而它们中的一些不能被成功的解析。

The problem was soon quite clear, some of the files had been encoded using UTF-16 which wasn’t playing nicely with PHP. To solve this I’ve written a function that attempts to detect if a string is encoded using UTF-16 (little endian or big endian) and then converts it to a slightly more PHP friendly UTF-8. All the complicated stuff is copied from these JavaScript functions for converting between UTF-8 and UTF-16.

原因很明显,一些文件是用对PHP不友好的UTF-16编码的。为了解决这个问题我写了一个尝试判断一个字符是否用UTF-16编码并将其转换成对PHP比较友好的UTF-8编码的函数。所有这些复杂的材料都是从JavaScript functions for converting between UTF-8 and UTF-16复制的。

function utf16_to_utf8($str) {
    $c0 = ord($str[0]);
    $c1 = ord($str[1]);

    if ($c0 == 0xFE && $c1 == 0xFF) {
        $be = true;
    } else if ($c0 == 0xFF && $c1 == 0xFE) {
        $be = false;
    } else {
        return $str;
    }

    $str = substr($str, 2);
    $len = strlen($str);
    $dec = '';
    for ($i = 0; $i < $len; $i += 2) {
        $c = ($be) ? ord($str[$i]) << 8 | ord($str[$i + 1]) : 
                ord($str[$i + 1]) << 8 | ord($str[$i]);
        if ($c >= 0x0001 && $c <= 0x007F) {
            $dec .= chr($c);
        } else if ($c > 0x07FF) {
            $dec .= chr(0xE0 | (($c >> 12) & 0x0F));
            $dec .= chr(0x80 | (($c >>  6) & 0x3F));
            $dec .= chr(0x80 | (($c >>  0) & 0x3F));
        } else {
            $dec .= chr(0xC0 | (($c >>  6) & 0x1F));
            $dec .= chr(0x80 | (($c >>  0) & 0x3F));
        }
    }
    return $dec;
}

Note this only does something if the string has a BOM, otherwise it is assumed that the string isn’t UTF-16 and it is returned unmodified.

注意这个函数只在字符串拥有BOM时有效,否则它推测字符串不是UTF-16编码的而返回没有经过修改的原始值。

I don’t know, but hopefully someone might find this useful. If anyone can see any problems with it please point them out, however at the moment it seems to be working for me.

我不知道,但是希望有人发现这个函数有用。如果谁发现这个函数有什么问题请指出来,至少目前为止它对我都是正确的。

用JavaScript实现PHP的sha1函数

2010年06月1日,星期二

在写JavaScript(严格的说应该是JScript)版的六维空间作弊工具时要用到sha1函数,而网上Google到的大部分只实现了返回字符串的形式,而我需要的是返回二进制形式的,没办法,还是自己写吧。还是PHP好,直接提供了一个sha1函数,不知道以后的JavaScript会不会提供。代码太长就不贴出来了,自己下载吧。参数和PHP的sha1函数一样,不会用的话查看PHP手册。sourceforge上面有一个jsSHA库,但是根据我的测试对中文的加密和PHP的sha1函数不一致,估计是写的时候没有考虑的JavaScript内部对字符串是UTF-16编码。

在线演示(注意在博客首页无法演示)

字符串:
SHA1值:

下载地址:[download id=8]