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.





sexta-feira, 17 de junho de 2022

Um esboço de jurimetria na relação do MPSP com o STJ (com Python, Pandas e Requests)


Jurimetria:

A jurimetria é aplicação de estatística e softwares voltados à análise de dados a assuntos ligados ao Direito e às decisões dos tribunais. Suas métricas servem de base à tomada de decisões, insights e à atuação estratégia dos atores da Justiça. 

Recursos Especiais (todos os assuntos):


Habeas Corpus (somente criminais):

_____

Obs.:  

1) A pesquisa foi automatizada. Os números mencionados no texto podem não ser exatos.

2) Os scripts rodaram em 17 jun. 2022. É a data que deve ser considerada ao se verificar quais REsp e HCs já possuíam decisões monocráticas.

3) Os códigos foram escritos em Python. Foram utilizadas as bibliotecas pandas (para as operações com o dataframe), matplotlib (para os gráficos), requests (para as requisições http ao site do STJ) e beautifulsoup (para a extração dos dados dos documentos html recuperados). A engine xlsxwriter foi usada para gravar o arquivo Excel em unicode.

Jupyter notebooks completos estão disponíveis para download em:

Confira os demais projetos.

4) Aparentemente, o “robô” também capturou os dados dos processos em “segredo de justiça”, embora tenha rodado sem autenticação no site do STJ.


segunda-feira, 6 de junho de 2022

O § 2º do art. 1º do PROVIMENTO CSM N°2519/2019: ou como o TJ nos delega serviço sem qualquer objeção do Ministério Público (reflexões para o debate Institucional)

 

 

  1. 1. O PROVIMENTO CSM N°2519/2019 determina a tramitação direta dos inquéritos policiais entre Polícia Civil e Ministério Público, procedimento esse que é estimulado pelo CNJ e CNMP e já tem sido adotado em outros Estados da Federação.  


  1. 2. O TJSP, no entanto, não abriu mão de fiscalizar a tramitação direta (e, por óbvio, o MPSP). Previu no § 2º do art. 1º o “registro das movimentações no sistema eletrônico deste Tribunal”. Para efetivar esse comando, “disponibilizou” o SAJ Judiciário a usuários do MP, para que nele cadastremos o andamento dos feitos (em redundância, portanto, com os registros feitos no SIS MP Integrado). 


  1. 3. O trabalho acrescido não é trivial. O CAOCrim, o CTIC e os funcionários da Barra Funda, cientes disso, elaboraram um valioso material para a instrução dos nossos funcionários (gratidão a todos!). Vale a pena dar uma olhada nos documentos gerados pela Administração para se ter uma ideia do tamanho do desafio (Cf.: https://bit.ly/3szqSLF. Acesso restrito ao público interno).   


  1. 4. Não há qualquer sentido, porém, no trabalho adicional que o TJSP impõe ao MPSP, por, pelo menos, duas razões: 


  1. a) O SIS MP Integrado foi preparado para controlar o trâmite direto dos inquéritos policiais, nos termos do art. 2º, § 1º, da Resolução nº 1.178/2019-PGJ/CGMP (Protocolado nº 89.112/2018); 


  1. b) O SIS MP Integrado possui banco de dados estruturado. Para cumprir a PROVIMENTO (se entendermos que o ato do TJ cria obrigações para o MPSP), bastaria que o CTIC criasse scripts (consultas SQL) para gerar os relatórios das movimentações de inquéritos policiais e encaminhá-los ao TJSP. O investimento no desenvolvimento dessa funcionalidade pouparia o trabalho de inúmeros Oficiais de Promotoria, já bastante onerados com as rotinas administrativas “tradicionais”. É verdade que o TJSP também precisaria investir algum esforço (a meu, ver pequeno) para importar esses dados no SAJ, mas o ônus se justifica no desejo do Judiciário de controlar o fluxo de procedimentos externos (e, agora, estranhos) à Instituição. 


  1. 5. Tenho notado gente minimizando o problema, afinal “os inquéritos policiais físicos estão em extinção”. É uma meia-verdade. No dia 05/06/2022, a Promotoria de Justiça de Piracicaba possuía, no chamado “acervo vivo”, cerca de 1657 inquéritos físicos em andamento (dos 4.542 existentes). Em porcentagem: 36% do total de IPs. Suponho que esse cenário se repita em outras localidades.


  2. 6. Em conclusão: vamos conviver com IPs físicos por alguns anos ainda e isso justifica, a meu ver, refletirmos mais detidamente (e com urgência) sobre o problema.


06/06/2022 

José Eduardo de S. Pimentel 

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

Obs.  


1) A arte foi feita com números de IPs físicos do “acervo vivo” da Promotoria de Justiça de Piracicaba, com uso da ferramenta on line WordArt.com. 

2) Os números do “acervo vivo” são aproximados. Para saber mais sobre a forma de cálculo, consulte: https://github.com/jespimentel/acervo_sis_mp_integrado, com dados da Promotoria de Justiça de Piracicaba na data da implementação da tramitação direta. 

 

domingo, 27 de março de 2022

Criptografia

Introdução

A palavra criptografia tem origem no Grego e significa "escrita secreta".

Há distinção entre cifra e código. Na cifragem, a transformação ocorre caractere por caractere ou bit por bit. É o que se faz hoje em dia. No código, as palavras são substituídas por palavras ou símbolos. Exemplo de uso de código: os EUA recrutaram índios navajos na 2a. Guerra Mundial que transmitiam, na língua deles, as ordens militares aos marines.

 

Terminologia


  • Texto simples (plaintext):  mensagem a ser criptografada;
  • Texto cifrado (ciphertext): mensagem na saída do processo de criptografia; 
  • Algoritmo de cifragem: função parametrizada por uma chave;
  • Chave: é a informação (protocolo conhecido pelo remetente e destinatário) que, aplicada ao algoritmo, permite criptografar ou decifrar a mensagem;
  • Criptologia: arte de criar mensagens cifradas (criptografia);
  • Criptoanálise: arte de solucionar mensagens cifradas;
  • Fator de trabalho: é o nível de dificuldade para decifrar a mensagem. Aumenta exponencialmente conforme o tamanho da chave.

 

Algoritmo

Questão interessante na criptografia é que, em regra, o algoritmo é conhecido de todos. Pelo princípio de Kerckhoff se estabelece que:

  • "Todos os algoritmos devem ser públicos: apenas as chaves são secretas".

 

Criptografia simétrica

Na criptografia simétrica uma mesma chave é usada para codificar e decodificar a mensagem.

Métodos:

  • substituição;
  • transposição;
  • multiplicação de matrizes.

 

Criptografia assimétrica (ou de chave pública)

Utiliza um par de chaves (pública e privada) para a codificação e a decodificação das mensagens. 

Aplicações:

  • assinatura digital;
  • autenticação.

 

Hash

É um algoritmo usado para mapear (resumir) dados de qualquer tamanho em dados pequenos e de tamanho fixo. 

Outra denominação: Message Digest (MD), ou “sumário da mensagem”.

Aplicações:

  • busca de elementos em base de dados;
  • verificação de integridade de dados grandes; e
  • armazenamento de senhas com segurança.

 

Fonte: TANENBAUM, Andrew S.; WETHERALL, David. Redes de computadores. 5a. ed. Trad. Daniel Vieira. São Paulo: Pearson Prentice Hall, 2011, p. 481-506.