2015年12月27日 星期日

function回傳陣列的方式

錯誤的方式:

int[] test() {
int b[3] ={1, 2, 3};
return b;
}


我們可以嘗試使用pointer回傳:

int* t()
{
  int *b=new int[3]={1,2,3};
  return b;
}

main()
{
  int *a;
  a=t();
}


note: 但如此一來,有可能會造成memory lost,由函式回傳陣例, 是個糟透了的習慣,memory 的 配置 和 釋放, 應該由使用的人去做, 由函式回傳陣例, 就會破壞了 配置 和 釋放 一對的規則, 所引申的問題有: 難於應用和延伸, memory lost ... ...

較佳的方式:

void t( int* b, int n_b )
{
  for( int i=0; i<n_b; i++ )
    b[i] = i;
}

int main()
{
  int a[10];
  t(a,10);
 
  system("pause");
  return 0;
}
 


2015年3月18日 星期三

Kahn process networks (KPN)



  • Determinism
同一組輸入會產生同一組的輸出,
Processes can be modeled as sequential programs that do reads and writes to ports in any order or quantity as long as determinism property is preserved. As a consequence, KPN model is deterministic so that following factors entirely determine outputs of the system:
  • processes
  • the network
  • initial tokens
Hence, timing of the processes does not affect outputs of the system.


2015年3月17日 星期二

有限狀態機 FSM

有限狀態機是由一組狀態一個起始狀態、 輸入、將輸入與現在狀態轉換為下一個狀態的轉換函數所組成。

比方說:自動販賣機、電梯升降系統、紅綠燈系統...


一個特殊的方式:
Global asynchronous Local synchronous
全域是非同步的,但區域是一個獨立同步的FSM。(my comment: 整體看起來像一個大型FSM,只是每個小的程序其實是一個獨立的FSM。)


一個FSM的特性:
單位時間同步化。
輸入階段、處理階段、運算結果是同一個單位時間的回饋。

  • 設計理念:

   輸入的瞬間,輸出已經完成。
  • 前提:

  1. 計算+內部處理不需要時間(歷時超級快速所以可以省略)。
  2. event 之間不是同步,就是歷時相差極遠。







2015年3月15日 星期日

數據驅動 vs 控制驅動

Data-driven concurrency(數據驅動併發):

1.The system is modelled as a set of processes without any explicit specification of the ordering of executions. 不會定義排程的執行順序。

2.The execution order of processes (and, implicitly, the potential of parallelism) is fixed solely by data dependencies 排程的執行順序是依照數據的相關性。

Control-driven concurrency(控制驅動併發):

1.The execution order of processes is given explicitly in the system model. 
在系統中已經明確指定執行順序。

2.Explicit constructs are used to specify sequential execution and concurrency. 
明確的結構用於指定順序執行和並發性。

2015年2月2日 星期一

inference problem


一個詐騙的例子:

     假裝要詢問「一群人」的「平均分數」,並且建立一個「資料庫」,但是對象的篩選方式刻意使其非常狹隘,最後只有一人被歸納到這個資料庫,而這個資料庫的平均分數其實就是這一個人的個人分數,而此人的分數就被不當窺探了。

對稱、非對稱

簡介:
Asymmetric Encryption (非對稱式加密) 即是為了改良 Symmetric Encryption(對稱式加密) 的缺點而產生的。
在對稱式加密中,通訊雙方往來的訊息是由同一把金鑰進行加密;假設 A 與 B 通訊,兩個人必須有一把相同的金鑰;而若是 A 也要與 C 通訊,則 A 與 C 則必須擁有另外一把不同的金鑰;否則若是都使用相同金鑰,C 就可以解密出 A 要給 B 的訊息,相對的,B 也可以解密出 A 要給 C 的訊息,如此一來資訊在傳送就不再安全!
除此之外,還要防範金鑰被竊取的問題,只要通訊雙方任何一個人把金鑰洩露出去,也就破壞了原本建立的安全機制了。


因此,Asymmetric Encryption(非對稱式加密) 使用了一對金鑰(key pair)的方式解決了這個問題

key pair:
在 Asymmetric Encryption 的架構中,要通訊的雙方都各持有一對金鑰,分別是私鑰(private key)以及公鑰(public key)。
顧名思義,private key 是要妥善且由自己秘密保管的,而 public key 則是可以公開出去。
假設使用者 A 有一對金鑰,若是 B 要與 A 進行通訊,則 B 必須使用 A 所提供的 public key 進行加密,再將加密的內容傳送給 A,接著 A 可以用自己的 private key 進行解密。
同樣的,A 要是要傳訊息給 B,則是要使用 B 所提供的 public key 進行加密,而 B 則可以用自己的 private key 進行解密。
有趣的是,雖然訊息是由 public key 所加密的,但是卻無法利用 public key 將原本的訊息還原回來,這就是非對稱式加密的精華所在,也是目前非常受到歡迎的原因。
而這一來一往之間,所使用的演算法,即為 RSA 演算法。

my words:
  1. 蠻酷的概念,就像是一個簡單二元一次,二元二次,可單向製造出一個result(視為加密),但單純運用這個result卻無法逆向推出這兩個未知數(無法解密)。
  2. 非對稱:2 keys, 公開金鑰給其他人「加密」專用, 不是用來解密的, 最後再使用自己的私人金鑰「解密」被公開加密的檔案。




Kerberos security


組成:
  • 憑證發放中心KDC
    • 身份鑑別伺服器AS(Authentication Server)
    • 通行證簽發中心TGS(Ticket Granting Server)
  • 使用者端(client)
  • 伺服器端(service server)

運作程序(簡化版):
  1. Client向Ticket Granting Server(TGS) 要求一張"通行證"
  2. TGS回傳給Client一個”加密”過的通行證, 只有對應Client知道解密方式, 以此確保唯有正確的Client才可以解密, 得到通行證
  3. TGS會把通行證“Client ID“有效期限”“時間戳記”...etc. 包裝成一個最終Ticket, 寄給Service server, 進行最後的認證

詳細運作程序:
首先,用戶使用客戶機(用戶自己的機器)上的程序登錄:
  1. 用戶輸入用戶ID和密碼到客戶機。
  2. 客戶機程序運行一個單向函數(大多數為雜湊)把密碼轉換成密鑰,這個就是客戶機(用戶)的"用戶密鑰"(K_client)。受信任的AS通過某些安全的途徑也獲取了與此密鑰相同的密鑰。
隨後,客戶機認證(客戶機從AS獲取票據的票據(TGT)):
  1. 客戶機向AS發送1條消息(注意:用戶不向AS發送密鑰(K_client),也不發送密碼):
    • 包含用戶ID的明文消息,例如"用戶Sunny想請求服務"(Sunny是用戶ID)
  2. AS檢查用戶ID有效性,而後返回2條消息:
    • 消息A:用戶密鑰(K_client)加密後的"客戶機-TGS會話密鑰"(K_TGS-session)(會話密鑰用在將來客戶機與TGS的通信(會話)上)
    • 消息B:TGS密鑰(K_TGS)加密後的"票據授權票據"(TGT)(TGT包括:客戶機-TGS會話密鑰(K_TGS-session),用戶ID,用戶網址,TGT有效期)
  3. 客戶機用自己的密鑰(K_client)解密A,得到客戶機-TGS會話密鑰(K_TGS-session)。(注意:客戶機不能解密消息B,因為B是用TGS密鑰(K_TGS)加密的)。
然後,服務授權(客戶機從TGS獲取票據(T)):
  1. 客戶機向TGS發送以下2條消息:
    • 消息c:即消息B(K_TGS加密後的TGT),和想獲取的服務的服務ID(注意:不是用戶ID)
    • 消息d:客戶機-TGS會話密鑰(K_TGS-session)加密後的"認證符"(認證符包括:用戶ID,時間戳)
  2. TGS用自己的密鑰(K_TGS)解密c中的B得到TGT,從而得到AS提供的客戶機-TGS會話密鑰(K_TGS-session)。再用這個會話密鑰解密d得到用戶ID(認證),而後返回2條消息:
    • 消息E:伺服器密鑰(K_SS)加密後的"客戶機-伺服器票據"(T)(T包括:客戶機-SS會話密鑰(K_SS-session),用戶ID,用戶網址,T有效期)
    • 消息F:客戶機-TGS會話密鑰(K_TGS-session)加密後的"客戶機-SS會話密鑰"(K_SS_session)
  3. 客戶機用客戶機-TGS會話密鑰(K_TGS-session)解密F,得到客戶機-SS會話密鑰(K_SS_session)。(注意:客戶機不能解密消息E,因為E是用SS密鑰(K_SS)加密的)。
最後,服務請求(客戶機從SS獲取服務):
  1. 客戶機向SS發出2條消息:
    • 消息e:即消息E
    • 消息g:客戶機-伺服器會話密鑰(K_SS_session)加密後的"新認證符"(新認證符包括:用戶ID,時間戳)
  2. SS用自己的密鑰(K_SS)解密e/E得到T,從而得到TGS提供的客戶機-伺服器會話密鑰(K_SS_session)。再用這個會話密鑰解密g得到用戶ID(認證),而後返回1條消息(確認函:確證身份真實,樂於提供服務):
    • 消息H:客戶機-伺服器會話密鑰(K_SS_session)加密後的"新時間戳"(新時間戳是:客戶機發送的時間戳加1)
  3. 客戶機用客戶機-伺服器會話密鑰(K_SS_session)解密H,得到新時間戳。
  4. 客戶機檢查時間戳被正確地更新,則客戶機可以信賴伺服器,並向伺服器(SS)發送服務請求。
  5. 伺服器(SS)提供服務。









DNS SECurity

DNSSEC 提供之資訊安全 
1.資料完整性 (data integrity)
2.來源可驗證性 (origin authentication of DNS data)

在數位簽章的概念中,當資料完整性被驗證後,我們已經可以確認資料未被竄改,而且確實由負責該 Domain 之 DNS Server 提供,但我們該如何驗證該 Domain 之 DNS Server 確實是真實的而非駭客自行架設的 DNS Server。 
在個人的數位簽章中,通常需將個人的 Public Key 交由公正的第三方加以驗證,也就是這把 Public Key 確實代表我個人。 
而在 DNSSEC 中,所謂的公正的第三方就是上層的 Domain DNS Server,也就是 DNS Server 必須將自己的 Public Key (DNSKEY) 做一次數位簽章後放在 Parent Zone Server,這種新的 RR(Resource Record) types 稱為DS(Delegation Signer),因此由 Parent Zone 中的 DS 紀錄可驗證 Child Zone之 DNSKEY 確實是正確且未經竄改。

也就是當我們相信 Parent Zone 的機器時,就可以信任 Child Zone 所詢問而得到的 DNS 結果,而又該如何相信 Parent Zone 呢? 就是相信 Parent of Parent Zone,如此層層認證,最後僅要我們相信 root zone,整個 DNS 信賴鍊就可完整構成。root Zone 因有專人負責管理,理論上應該不易被駭客入侵。

3.可驗證之不存在性 (authenticated denial of existence)


一種常見的公私鑰匙加密的應用是數位簽章,例如某用戶A剛完成了一封電子信件,A根據該信件的內容使用雜湊函式產生一組驗證值(Hash Value),接著以自己的私有鑰匙對該驗證值加密、產生一組數位簽章,並將該簽名附於信末,之後寄出給B。
B收到信後先利用A的公眾鑰匙解開該信的數位簽章,若順利無誤,B即可確定該信的確是來自A,接著B使用同樣的雜湊函式計算該信的驗證值,若發現與先前公眾鑰匙解開的數位簽章內附的值相同,表示該信內容未遭竄改。上述的數位簽章的功能證明了三件事: 

信件來源確實是A
信件內容沒有遭竄改 
發信人A無法否認曾發過信 

DNSSEC之限制: 
(1)隱密性(Confidentiality)DNSSEC 傳遞的 RR & 及RRSIG 傳輸過程皆未加密,因此中間可能被sniffer 之設備或程式讀取。但被讀取不代表能假造,因為駭客並無 DNS Server 之 Private Key,因此無法假造出 RRSIG 的資料而不被發覺。
(2)服務可用性(Availability)
DNSSEC 僅是一項服務,若有駭客發動DDoS 攻擊,不斷的詢問成千上萬個網址,則 DNS Server 可能因負荷過重而無法正常運作。不過這項弱點應是所有 Internet 服務皆共有的現象,而不單是 DNSSEC 之弱點。