文章目录
- git下载与配置
- 公开秘钥算法
- git重点知识简介
- 一个曾出现过的error
git下载与配置
关于git的下载,去官网下载好安装包,直接安装即可。配置中会用到下面的命令。
# global为全局参数,表示本地所有仓库都会用到这个配置
git config --global user.name "yourname"
git config --global user.email "your_email@youremail.com"
公开秘钥算法
最后的最后,记一下最近了解的和git配置公钥私钥有关系的公开秘钥算法。
简单用一句话来说就是
加密秘钥和解密秘钥是不同的。并且从加密秘钥不能得到解密密钥。
说的科学严谨点就是
记加密算法为E,解密算法为D,要加密的数据为P。满足:
1.D(E(P))= P
2.从E导出D非常困难
3.破译者即使能加密任意的选择明文,也无法破译密码。
满足以上三个条件,则加密算法可以完全空开。
在这种算法中,每个用户都有两个密钥,其中加密秘钥是供向他人发送报文用的,这是公开的。解密密钥是用于对收到的密文进行解密的,这是保密的。
在实际应用中,有个较好的算法是MIT一个研究小组所提出的RSA算法。
我简单的用代码实现了一下整个流程,如下:
/*RSA算法基于简单的数论事实:将两个大质数相乘十分容易,但是想要
对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。*/
#include<iostream>
using namespace std;
// <1> 选择两个大素数p, q (一般实际中超过几百位的10进制数)
// <2> 计算 n = p*q, z = (p-1)*(q-1)
// <3> 选择一个与z互质的数,令其为d
// <4> 找到一个e是的e*d=1(mod z)
// 理论上的推到可借助欧拉函数
/*在一个安全实现中,Huge 最少要400位10进制数字*/
typedef unsigned long Huge;
/*为RSA公钥定义一个数据结构,*/
typedef struct RsaPubKey{
Huge e;
Huge n;
}RsaPubkey;
/*为RSA私钥定义一个数据结构*/
typedef struct RsaPriKey{
Huge d;
Huge n;
}RsaPriKey;
// 加密过程就是 C = P的e次方mod n,解密就是P = C的d次方mod n
static Huge modexp(Huge a, Huge b, Huge n){
Huge y;
/*使用二进制平方乘法计算 pow(a,b) % n*/
y=1;
while(b != 0)
{
/*对于b中的每个1,累加y*/
if(b & 1)
y = (y*a) % n;
/*对于b中的每一位,计算a的平方*/
a = (a*a) % n;
/*准备b中的下一位*/
b = b>>1;
}
return y;
}
/*rsa_encipher RSA算法加密*/
Huge rsa_encipher(Huge plaintext, RsaPubKey pubkey){
Huge ciphertext;
ciphertext = modexp(plaintext, pubkey.e, pubkey.n);
return ciphertext;
}
/*rsa_decipher RSA算法解密*/
Huge rsa_decipher(Huge ciphertext, RsaPriKey prikey){
Huge plaintext;
plaintext = modexp(ciphertext, prikey.d, prikey.n);
return plaintext;
}
int main(){
/*此处做一个简单演示 设p = 17, q = 11。则n = 187,z=160
13与z=160互质,所以d可以为13,13*e = 1(mod z) 经计算选择
e = 37 。所以公钥为(37,187) 私钥为(13,187)*/
RsaPubKey pubkey;
RsaPriKey prikey;
pubkey.e=37;
pubkey.n=187;
prikey.d=13;
prikey.n=187;
/*这里要注意实际中明文转为的比特串要划分为一个个的数据块
进行加密。这里为了方便直接就一个数据块。这个数据块的大小有限制
数据块的大小范围: 0<=P<=n
如果为比特串,比特串的长度k的最大值满足: 2的k次方小于n*/
Huge plaintext = 88;
Huge cipher = rsa_encipher(plaintext,pubkey);
cout<<"加密后的密文:"<<cipher<<endl;
Huge plain = rsa_decipher(cipher,prikey);
cout<<"解密后的明文:"<<plain<<endl;
}
同时,也应当知道,RSA算法虽然安全方便,但是其运行速度较慢,因而通常只用来进行用户认证,数字签名或者发送一次性的密钥。数据加密仍使用密钥算法。
git重点知识简介
- git本地仓库是由git维护的三个部分组成:
- 工作目录: 含有实际文件
- 暂存区: 类似于缓存区域,临时保存你的改动
- HEAD: 类似于指针,指向你最后一次提交的结果
例如执行
git add filename 操作是将实际文件修改添加到暂存区
git commit -m "info" 将改动提交到本地的head 但是还没到远程仓库
git push origin master 可以将master换成任何你想要推送的分支
- GitHub远程仓库中分支与主支
分支和主支的区别,你可以理解为就是,分支是自己私人的空间,别人没办法看到和修改,主支大家都可以看到和修改。
关于这块的详细解释,推荐一篇教程:
GitHub分支管理 分支是用来将特性开发绝缘开来的。 在你创建仓库时,master
是"默认的"分支,也即主分支,串起来开始到现在git仓库的时间线
- 创建分支并切换
$ git checkout -b newbran # -b参数表示创建并切换
Switched to a new branch ‘newbran’
以上这步也可这么分步执行
$ git branch newbran
$ git checkout newbran
Switched to branch ‘newbran’ - 合并到主支:
$ git merge newbran
git merge命令用于合并指定分支到当前分支。 - 删除分支
$ git branch -d newbran
注:
- git branch命令用于查看当前分支情况
- git最新版本提供了git switch命令来切换分支更容易理解。
- 标签管理
git中还有一个很方便的东西,叫做标签管理。详细介绍可去看详细教程。这里列出常用命令
- git tag 用于新建一个标签,默认为HEAD,也可以指定一个commit id;
- git tag -a -m "blablabla…"可以指定标签信息;
- git tag可以查看所有标签。
- git push origin 可以推送一个本地标签;
- git push origin --tags可以推送全部未推送过的本地标签;
- git tag -d 可以删除一个本地标签;
- 命令git push origin :refs/tags/可以删除一个远程标签。
几个要知道的命令:
git status命令可以查看仓库当前的状态
git diff 查看difference,也就是到底哪里被修改了
git checkout – 可以丢弃工作区的修改
git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”
(最新版本提供了新的git switch命令)。
git reset HEAD 暂存区的修改撤销掉(unstage)
git当中的后悔药=— git reflog 在本地的仓库里执行会显示你执行的所有命令
git rm filename 删除文件
git reset --hard id 根据 id 回退到指定的版本
一个曾出现过的error
git解决error: The following untracked working tree files would be overwritten by checkout
(git bash中执行)git clean -d -fx
git clean 参数
-n 显示将要删除的文件和目录;
-x -----删除忽略文件已经对git来说不识别的文件
-d -----删除未被添加到git的路径中的文件
-f -----强制运行
git clean -n
git clean -df
git clean -f