需求

本机原先有一个 ssh key 用于 github 管理,现需要另外一个 key 来管理 openshift 上的应用。
由于某些原因将 .ssh/ 下文件全删了,然后 openshift 的 sshkey 生成成功。
现在需要重新为 github 生成一对密钥,即本机需要管理两对密钥。

阅读全文 »

##前言
在找免费/低价的vps之类的产品,找了半天发现Openshift里有提供试用的。
挂上代理,尝试了一下,使用过程记录如下。

##Openshift介绍

OpenShift是红帽公司推出的一个云计算服务平台,开发人员可以用它来构建和发布web应用。Openshift广泛支持多种编程语言和框架,如Java,Ruby和PHP等。另外它还提供了多种集成开发工具如Eclipse integration,JBoss Developer Studio和 Jenkins等。OpenShift 基于一个开源生态系统为移动应用,数据库服务等,提供支持。

Openshift online 是一个面向开源开发人员开放的平台即服务(Pass).
Openshift 提供一年的免费服务,这也是本文的前提之一,创建应用后,我们可以通过多种途径(其实只有三种)方便地管理应用。

阅读全文 »

##概述

隐写术是关于信息隐藏,即不让计划的接收者之外的任何人知道信息的传递事件(而不只是信息的内容)的一门技巧与科学。
通常我们隐写的对象是图片,音频,视频,文档等,为了方便,我们常常使用一些工具。
本文记录这些工具的安装过程以及简单用途。 本文实验环境为 linux(openSUSE 13.1), 而 windows 以及 os x 环境下类似。

阅读全文 »

##什么是NinePatch图片

在传统 UI 开发中,如果背景的大小不一样,一般需要制作多张图片来适应不同大小的背景。
而在 Android 中专门有一种叫 NinePatch 的图片(以 .9.png 为后缀)来解决背景大小不一样时,只用一张背景图片。
同时 NinePatch 图片可以适应各种拉伸收缩的需求而不失真以及文字的布局需求,用来适应 Android 设备那五花八门的分辨率。

阅读全文 »

在ctf比赛以及各种加密解密的游戏中,经常会遇到各种加密信息需要解密。

在此,我总结了一些常见的加密方法(有的比较古老比较经典),持续更新。

##凯撒密码

##维吉尼亚密码

##栅栏密码

##CRC32
CRC码实质上是循环冗余校验码,是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。

而CRC32就是其中的一种,其算法能够根据原数据生成8位16进制的CRC码。

正是因为这个功能,它也可以被用作特定情况下的数据加密。

在JAVA的标准库中就有现成的类可以实现对字符串的CRC32的加密。

参考:

CRC校验算法原理

CRC加密代码

##摩斯密码

##MD5
MD5 即 Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。

MD5算法具有以下特点:

  1. 压缩性:任意长度的数据,算出的MD5值长度都是固定的。
  2. 容易计算:从原数据计算出MD5值很容易。
  3. 抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
  4. 弱抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
  5. 强抗碰撞:想找到两个不同的数据,使它们具有相同的MD5值,是非常困难的。

因此其作用是让大容量信息在用数字签名软件签署私人密钥前被”压缩”成一种保密的格式(也就是把一个任意长度的字节串变换成一定长的十六进制数字串)。除了MD5以外,其中比较有名的还有sha-1、RIPEMD以及Haval等。

MD5密文特点

  1. 标准MD5加密时,密文为32位或16位
  2. 加密过程可以进行加盐,或多次加密等等
  3. 其他加密类型参考这里

MD5应用:

  1. 一致性验证,即文件校验
  2. 数字证书,即指纹识别
  3. 安全访问认证,即操作系统的登录认证等

参考:

MD5加密与网络数据安全

简单MD5解密

##最小生成树
最小生成树:任何只由G的边构成,并包含G的所有顶点的树称为G的生成树(G连通). 加权无向图G的生成树的代价是该生成树的所有边的代码(权)的和. 最小代价生成树是其所有生成树中代价最小的生成树。

最小生成树其实是最小权重生成树的简称。

以有线电视电缆的架设为例,若只能沿着街道布线,则以街道为边,而路口为顶点,其中必然有一最小生成树能使布线成本最低。

##性质

  • 最小生成树的边数必然是顶点数减一,|E| = |V| - 1。
  • 最小生成树不可以有循环。
  • 最小生成树不必是唯一的。

##常用算法

  • kruskal算法
  • Prim算法

##思想
贪心法:一次“生成”一条“安全边“

1
2
3
4
5
6
GENERIC-MST-FUNCTION (G,w)
1 T := 空集合
2 while T 还不是生成树
3 do 找出对 T 来说是不会形成环,且权重最低的边 (u, v)
4 T := T U {(u, v)}
5 return T

##kruskal算法

###步骤

  1. 新建图G,G中拥有原图中相同的节点,但没有边
  2. 将原图中所有的边按权值从小到大排序
  3. 从权值最小的边开始,如果这条边连接的两个节点于图G中不在同一个连通分量中,则添加这条边到图G中
  4. 重复3,直至图G中所有的节点都在同一个连通分量中

###模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
//基于并查集
class Edge{
public:
int u, v; //两个结点
double len; //边权
//bool choose; //边是否使用过

Edge(){}
Edge(int _u, int _v, double _len){
u = _u;
v = _v;
len = _len;
//choose = false;
}
};

//比较函数,升序
bool cmp(const Edge &a, const Edge &b){
if (a.len < b.len){
return true;
}else{
return false;
}
}

class kruskal{
vector<Edge> edge; //边的集合
vector<int> father; //结点的父亲结点
int n; //n points
int ans; //the least values of the spanning tree

void Solve(){
///Init///
edge.clear();
father.clear();

///read point///
(read edge[])
(initial father[])

///get edges sorted///
sort(edge.begin(), edge.end(), cmp);

///kruskal start///
int cnt = 0;//number of edges
ans = 0;
for (int i = 0; i < edge.size(); i++){
if (cnt == n-s-1) break;
//一般地,s为0.
//如果有s条边在算法开始之前确定是最小生成树的一部分,当cnt=n-s-1时,算法完成。
if (IsSameFa(edge[i].u, edge[i].v)) continue;
Union(edge[i].u, edge[i].v);
edge[i].choose = true;
ans += edge[i].len;
cnt++;
}

///output///
}

bool IsSameFa(int x, int y){
return GetFather(x) == GetFather(y);
}

void Union(int x, int y){
father[GetFather(x)] = GetFather(y);
}

int GetFather(int x){
if (father[x] == x) return x;
else return father[x] = GetFather(father[x]);
}

}

###算法分析与适用范围
Kruskal算法需要对图的边进行访问,所以时间复杂度只和边有关系,可以证明其时间复杂度为O(E*logE)。

比较适合求稀疏图的最小生成树。

##demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
using namespace std;

void fac(int n){
int a = 2;
while(a*a <= n){
while(n%a == 0){
cout << a << endl;
n = n/a;
}
a++;
}
if (n > 1) cout << n << endl;
}

int main(){
int n;
cin >> n;
fac(n);
}