GitBook

Learn Javascript with GitBook

GitBook is a good way to tell you how to program with precisely written source code.
Here is a Javascript book which I finished reading it within 3 hours. If you have learned C language before, you will find how simple Javascript’s syntax is.

LibTom 加密之SHA1

下面的C程序实现的功能:
将pInData数组内数据进行hash-sha1运算,得到摘要值hash


首先引入头文件

#include "tomcrypt.h"  
#pragma comment (lib,"tomcrypt.lib")

声明变量(hash状态、执行返回结果、hash结果存放数组), 赋初值

hash_state      md;
int             ret = 0;
int             hash_index = 0;
unsigned  long	hashLen = 0;
unsigned  char	hash[MAXBLOCKSIZE];

memset(hash,0,MAXBLOCKSIZE);

unsigned  char	pInData[1024] = {0}; 
unsigned  long	InDataLen = 1024;

//待HASH数据
memcpy(pInData,"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",52);

注册hash函数

hash_index = register_hash(&sha1_desc);
if (hash_index == -1)
{
	printf_s("register_hash err\n"");
	return -1;
}

HASH后数据长160bit,20字节

hashLen = hash_descriptor[hash_index].hashsize;

HASH流程(init->process->done)

ret = hash_descriptor[hash_index].init(&md);
if (ret!=CRYPT_OK)
{
	printf_s("hash_descriptor.init err\n"); 
	return -1;
}
ret = hash_descriptor[hash_index].process(&md,pInData,InDataLen);
if (ret!=CRYPT_OK)
{
	printf_s("hash_descriptor.process err\n"); 
	return -1;
}
ret = hash_descriptor[hash_index].done(&md, hash);
if (ret!=CRYPT_OK)
{
	printf_s("hash_descriptor.done err\n"); 
	return -1;
}

打印hash结果

printf_s("消息摘要长度:\n%d\n\n",hashLen);

printf_s("消息摘要:\n");
for (int i=0;i<hashLen;i++)
{
	printf_s("%x",hash[i]);
}
printf_s("\n\n");

查看GitHub 完整代码

LibTom 加密之AES

下面的C程序实现的功能:
将字符串c1用AES方法加密放在c2中,再解密放在c3中,密钥是myKey


加密部分:

首先引入头文件

#include "tomcrypt.h"  
#pragma comment (lib,"tomcrypt.lib")

声明变量:加密密钥、加密状态

unsigned char myKey[32] = "7187654321";	     
symmetric_key skey = 0;

加密前初始化状态(密钥,密钥长度,迭代次数(0: 使用推荐值),加密状态)

aes_setup(myKey, 32, 0, &skey);

需要加密的字符串长度任意
输出长度>= 输入长度,分段长度的倍数(这里就是16的倍数)

unsigned char c1[32] = "硬件研发中心";		   
unsigned char c2[32] = {0};

分段加密,每段长度为16 (一般不可能只有2段,自己写循环)

aes_ecb_encrypt(&c1[0], &c2[0],&skey);     
aes_ecb_encrypt(&c1[16], &c2[16],&skey);

输出密文

printf_s("encrypted data:\n");
for (int i=0;i<32;i++)
{
	printf_s("%x",c2[i]);
}
printf_s("\n\n");

解密部分:

定义c3数组,存放解密数据

unsigned char c3[32] = {0};

解密前初始化状态,和加密的状态是完全一致的

aes_setup(myKey, 32, 0, &skey);

分段解密

aes_ecb_decrypt(&c2[0], &c3[0],&skey);     
aes_ecb_decrypt(&c2[16], &c3[16],&skey);

打印解密数据

printf_s("decrypted data:\n");
for (int i=0;i<32;i++)
{
	printf_s("%c",c3[i]);
}
printf_s("\n\n");

查看GitHub 完整代码

Data Structure Visualizations

Quick Sort

=> Data Structure Visualizations Website

Currently, we have visualizations for the following data structures and algorithms:

  • Basics
    • Stack: Array Implementation
    • Stack: Linked List Implementation
    • Queues: Array Implementation
    • Queues: Linked List Implementation
    • Lists: Array Implementation (available in java version)
    • Lists: Linked List Implementation (available in java version)
  • Recursion
    • Factorial
    • Reversing a String
    • N-Queens Problem
  • Indexing
    • Binary Search Trees
    • AVL Trees (Balanced binary search trees)
    • Red-Black Trees
    • Splay Trees
    • Open Hash Tables (Closed Addressing)
    • Closed Hash Tables (Open Addressing)
    • Closed Hash Tables, using buckets
    • B Trees
    • B+ Trees
  • Sorting
    • Comparison Sorting
      • Bubble Sort
      • Selection Sort
      • Insertion Sort
      • Shell Sort
      • Merge Sort
      • Quck Sort
    • Bucket Sort
    • Counting Sort
    • Radix Sort
    • Heap Sort
  • Heap-like Data Structures
    • Heaps
    • Binomial Queues
    • Fibonacci Heaps
    • Leftist Heaps
    • Skew Heaps
  • Graph Algorithms
    • Breadth-First Search
    • Depth-First Search
    • Connected Components
    • Dijkstra’s Shortest Path
    • Prim’s Minimum Cost Spanning Tree
    • Topological Sort (Using Indegree array)
    • Topological Sort (Using DFS)
    • Floyd-Warshall (all pairs shortest paths)
    • Kruskal Minimum Cost Spanning Tree Algorithm
  • Dynamic Programming
    • Calculating nth Fibonacci number
    • Making Change
    • Longest Common Subsequence
  • Geometric Algorithms
    • 2D Rotation and Scale Matrices
    • 2D Rotation and Translation Matrices
    • 2D Changing Coordinate Systems
    • 3D Rotation and Scale Matrices
    • 3D Changing Coordinate Systems
  • Others …
    • Disjoint Sets
    • Huffman Coding (available in java version)

Sometimes

有时,真想使劲不务正业一把。或许是搞搞音乐周边,也大概贩卖点科技产品,又或许去大胆尝试自己的线上家居设计店,呵呵 想一会自己这些不靠谱的想法心情就会好很多,他们都是我心里的宝,担心、害怕我的一生都会在它们的伴随中度过。

人生的苦闷有二,一是欲望没有被满足,二是它得到了满足。

Several Plato’s Quotes

  • 柏拉图说:人生最遗憾的,莫过于,轻易地放弃了不该放弃的,固执地,坚持了不该坚持的。

  • 柏拉图说:第一财富是健康,第二财富是美丽,第三财富是财产。

  • 柏拉图说:我们的生活有太多无奈,我们无法改变,也无力去改变,更糟的是,我们失去了改变的想法。

  • 柏拉图说:有时,爱也是种伤害.残忍的人,选择伤害别人,善良的人,选择伤害自己。

  • 柏拉图说:时间带走一切,长年累月会把你的名字、外貌、性格、命运都改变。

  • 柏拉图说: 如果,不幸福,如果,不快乐,那就放手吧;如果,舍不得、放不下,那就痛苦吧。

  • 柏拉图说:这个世界就这么不完美。你想得到些什么就不得不失去些什么。

  • 柏拉图说:时间会慢慢沉淀,有些人会在你心底慢慢模糊。学会放手,你的幸福需要自己的成全。

  • 柏拉图说:人生短短几十年,不要给自己留下了什么遗憾,想笑就笑,想哭就哭,该爱的时候就去爱,无谓压抑自己。人生的苦闷有二,一是欲望没有被满足,二是它得到了满足。

GTD Tools

做幸福行动家

  • RTM 记录工作、学习等重要事项
  • Any.do 记日常生活琐事,待办事件的最大容器
  • Clear 记有待尝试的事情
  • Evernote 记工作、学习,与RTM同步

Websites Focus On Security

安全牛
[安全牛]是近期通过36Kr了解到的一个安全创业网站,此网站介绍了很多安全技术,

包括:

  • 移动安全
  • web安全
  • 数据安全
  • 网络安全
  • 黑客攻防
  • 云安全
  • 端点安全
  • 应用安全
  • 安全开发

另外,安全牛网解读了很多当下的安全形势以及威胁。