算法题破解
1. DES中S盒算法——解题
在密码学中,S盒(Substitution-box)是对称密钥算法执行置换计算的基本结构。S盒用在分组密码算法中,是唯一的非线性结构,其S盒的指标的好坏直接决定了密码算法的好坏。 ——网络
S盒有8个盒子,下表是DES算法中S4盒的选择矩阵,如果其输入为101011,求输出结果。
解:已知输入为101011
(1)、取头尾11,进行二进制转换为十进制为3,表示取表格的第3行
(2)、然后中间0101,进行二进制转换为十进制为5,表示取表格的第五列
(3)、(3,5)对应表格中的数字是12,12转换为二进制就是1100
答:如果该盒输入为101011则输出的结果为1100
2. 帮我解决一道C语言算法的问题
这是一个最大子序列和问题。通常用动态规划法解。至于动态规划的数学模型,懒得去查了,直接给你找了一个算法,你凑合看吧。
从整数序列头部开始扫描,假设现扫描到的位置为i,求取从0到i所有元素的和sum[i],sum[i]取最大值的地方即为最大子序列的结束位置,设为a。从结束位置a向前扫描,找到第一个小于零的位置b,b+1就是最大子序列的开始位置。求从b+1到a位置的值即可得到最大子序列和。按此思路该算法时间复杂度为O(m+n),其中m, n分别为最大子序列的长度、给定整数序列的长度。
改进:根据对上述算法的进一步分析,可以知道,最大子序列和中必然不存在前缀子序列小于0的情况,于是设一ThisSum用于指示当前子序列和。改进算法描述如下:从整数序列头部开始扫描,累加序列元素和ThisSum,若ThisSum<0,则停止累加子序列和,将ThisSum清零,并从下一位置重新开始累加ThisSum,否则将ThisSum与当前MaxSum比较,并更新MaxSum。此改进算法时间复杂度仅为O(n),n为给定整数序列的长度。
int MaxSubsequenceSum3(const int A[], int N)
{
int ThisSum, MaxSum, i;
ThisSum = MaxSum = 0;
for(i = 0; i < N; i++)
{
ThisSum += A[i];
if(ThisSum > MaxSum)
MaxSum = ThisSum;
else if(ThisSum < 0)
ThisSum = 0;
}
return MaxSum;
}
3. 异或算法的密钥破解,知道密文和明文 ,可以求密钥吗已知是异或加密的,写个原理也好的。
可以。
比如:明文(如1111)⊕密钥(如1001)得到密文(如0110)
然后拿密文(0110)⊕明文(1111)就得密钥(1001)