部分密碼演算法(Algorithm)有特殊的邏輯運算需求,筆記常用的Exclusive OR(XOR)⊕,順便複習OR及AND運算差異。
PIN Blocks、TripleDES..
XOR:當兩兩數值相同為否,而數值不同時為真
在C#中其實只要將16進位數值的明文字串轉換為整數/布林/位元組再用^就解決了。
這邊假設都先將運算元轉成位元組再運算
XOR運算
public static byte[] XOR(byte[] bHEX1, byte[] bHEX2)
{
byte[] bHEX_OUT = new byte[bHEX1.Length];
for (int i = 0; i < bHEX1.Length; i++)
{
bHEX_OUT[i] = (byte)(bHEX1[i] ^ bHEX2[i]);
}
return bHEX_OUT;
}
OR運算
public static byte[] OR(byte[] bHEX1, byte[] bHEX2)
{
byte[] bHEX_OUT = new byte[bHEX1.Length];
for (int i = 0; i < bHEX1.Length; i++)
{
bHEX_OUT[i] = (byte)(bHEX1[i] | bHEX2[i]);
}
return bHEX_OUT;
}
AND運算
public static byte[] AND(byte[] bHEX1, byte[] bHEX2)
{
byte[] bHEX_OUT = new byte[bHEX1.Length];
for (int i = 0; i < bHEX1.Length; i++)
{
bHEX_OUT[i] = (byte)(bHEX1[i] & bHEX2[i]);
}
return bHEX_OUT;
}
OK!方法寫好了,來測試一下結果,實驗的2組運算數值如下
0 | 1 | 0 | 1 |
1 | 1 | 0 | 0 |
//[運算元1]
byte[] bHEX1 = new byte[] { 0x00, 0x01, 0x00, 0x01 };
//[運算元2]
byte[] bHEX2 = new byte[] { 0x01, 0x01, 0x00, 0x00 };
//[AND運算]
byte[] bAND = AND(bHEX1, bHEX2);
//[OR運算]
byte[] bOR = OR(bHEX1, bHEX2);
//[XOR運算]
byte[] bXOR = XOR(bHEX1, bHEX2);
//[輸出結果]
Console.WriteLine("[AND 運算]");
for (int i = 0; i < 4; i++)
{
Console.WriteLine("{0} & {1} = {2}", bHEX1[i], bHEX2[i], bAND[i]);
}
Console.WriteLine("");
Console.WriteLine("[OR 運算]");
for (int i = 0; i < 4; i++)
{
Console.WriteLine("{0} | {1} = {2}", bHEX1[i], bHEX2[i], bOR[i]);
}
Console.WriteLine("");
Console.WriteLine("[XOR:Exclusive OR:異或運算:⊕]");
for (int i = 0; i < 4; i++)
{
Console.WriteLine("{0} ^ {1} = {2}", bHEX1[i], bHEX2[i], bXOR[i]);
}
運算結果:
表格一下:
運算元1 | 0 | 1 | 0 | 1 |
運算元2 | 1 | 1 | 0 | 0 |
AND運算 | 0 | 1 | 0 | 0 |
OR運算 | 1 | 1 | 0 | 1 |
XOR運算 | 1 | 0 | 0 | 1 |
參考: