domingo, 23 de outubro de 2022

Operações básicas com matrizes usando o NumPy

O NumPy (Numerical Python) é bastante eficiente no processamento de arrays.

Seu principal objeto é o N-dimensional array (ndarray) ou tensor. 

Matrizes são tensores com 2 dimensões (tensores de rank 2), de aplicação muito frequente.

Neste notebook reunimos as operações matriciais mais básicas do NumPy para o estudo do tema.

Para saber mais: http://www.opl.ufc.br/pt/post/numpy/

------------------------

import numpy as np


# Criando as matrizes

A = np.array([[1, -2, 3], [2, 0, 4]])

B = np.array([[2, 2, -4], [-1, 1, 0]])

display(A, B)


# Soma de matrizes

display(A+B)


# Subtração de matrizes

display (A-B)


# Multiplicação de uma matriz por um escalar

k = 3

display (k*A)


# Matriz oposta (de A)

display(-A)


# Multiplicação de matrizes

A = np.array([1, 2, 3])

B = np.array([[4], [5], [6]])

display(A, B)

display(A.dot(B))


# Criação de matriz identidade

I = np.identity(3)

display(I)


# Matriz inversa

A = np.array([[3, -2], [-1, 1]])

B = np.array([[1,2],[1,3]])

print('Inversas:')

display(np.linalg.inv(A))

display(np.linalg.inv(B))


# Matriz singular (não tem inversa)

A = np.array([[6, 3], [2, 1]])

display(np.linalg.inv(A))  # LinAlgError: Singular matrix


# Determinante de uma matriz quadrada

A = np.array([[2, 4], [-3, -1]])

display(np.linalg.det(A))

sábado, 22 de outubro de 2022

Descriptografando os dados de login salvos pelo Chrome

O Chrome oferece a facilidade de salvar senhas dos sites visitados.

As senhas são armazenadas no formato do SQLite3 (figura abaixo). No Windows, o banco de dados pode ser localizado em C:\Users\<nome do usuário>\AppData\Local\Google\Chrome\User Data\Default\Login Data.

Selecionando-se os campos action_url, username_value, password_value da tabela logins, obtemos as urls, usuários e senhas (criptografadas em AES).

A criptografia AES é do tipo simétrico. Isso quer dizer que a mesma chave é usada para criptografar e descriptografar o texto. Para aumentar a segurança, o processo de encriptação usa um "vetor de inicialização" (IV),  que corresponderá aos caracteres das posições 4-20 recuperados de password_value. A senha cifrada corresponderá aos caracteres da posição 21-(N-16), sendo N a última posição da "string".

A chave de criptografia/descriptografia está localizada no arquivo JSON existente em C:\Users\<nome do usuário>\AppData\Local\Google\Chrome\User Data\Local State, precedida da chave encrypted_key.

O código publicado no GitHub, escrito em Python, encontra a chave no arquivo Local State e a utiliza para descriptografar as senhas (password_value) da tabela logins do arquivo Login Data (banco de dados do SQLite3). 

Repositório: https://github.com/jespimentel/chrome-passwords

Referências: 



quarta-feira, 12 de outubro de 2022

Lista de datas com Python

O Python possui nativamente o módulo datetime, para trabalhar com datas e tempo.

O problema a ser resolvido demandava a criação de uma lista de datas (em formato ISO 8601) que compreendesse todos os dias entre uma data informada e o dia de hoje.

Foram usadas os seguintes métodos:

datetime.now(): para retornar a data/hora corrente;

datetime.strptime(): para retornar um data/hora no formato informado; 

datetime.timedelta(): para retornar a diferença entre datas.

Depois de obtida a diferença de dias entre a data fornecida e a atual (n), cria-se a lista a partir de um iterador finito (for ... in ...), que incrementa 1 dia a partir da data inicial e até o dia n+1.